2016-07-13 3 views
0

Я пытаюсь сделать простую игру Android с OpenGL, и до недавнего времени все было довольно гладко. Я смог создать и запустить приложение на s7 и эмуляторе Nexus 5, но мои попытки запустить его на моем s6 не удались.S6 Android OpenGL компиляция при создании шейдера

Казалось, что шейдер не смог скомпилировать. Я не уверен, что вызывает эту проблему. Я просмотрел и возился с множеством мелких вещей, но не повезло. Я полагаю, что я должен упустить что-то очевидное. Я прочитал другие ответы, но они, похоже, не относятся к игре, которая уже работает на других устройствах. Ниже приведен мой шейдерный код и простые функции opengl.

public Shader(String data, int kind) throws IllegalArgumentException { 
    this.kind = kind; 
    shader = GLES20.glCreateShader(kind); 
    GLES20.glShaderSource(shader, data); 
    GLES20.glCompileShader(shader); 

    int[] compiled = new int[1]; 
    GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); 
    if (compiled[0] == GLES20.GL_FALSE) { 
     String log = GLES20.glGetShaderInfoLog(shader); 
     dispose(); 
     throw new IllegalArgumentException("Shader compilation error: " + log); 
    } 
} 

И вот функции openGL для затенения.

public static final String VERT_SHADER = 
    "#version 100\n" + 

    "uniform float surfaceRatio;\n" + 
    "attribute vec2 position;\n" + 

    "void main() {\n" + 
    " gl_Position = vec4(position.x * surfaceRatio, position.y, 0.0f, 1.0f);\n" + 
    "}\n"; 

// The fragment shader code. 
public static final String FRAG_SHADER = 
    "#version 100\n" + 

    "uniform vec3 color;\n" + 

    "void main() {\n" + 
    " gl_FragColor = vec4(color, 1.0f);\n" + 
    "}\n"; 

Сообщите мне, если есть что-то очевидное, что мне не хватает, что может вызвать проблемы с перекрестной платформой. Я могу предоставить больше кода или информации по мере необходимости.

ответ

0

Ваш синтаксис постоянной с плавающей запятой недействителен в GLSL ES 1.00. Постфикс f не является частью разрешенного синтаксиса. Поэтому везде, где у вас есть 0.0f в коде шейдера, вам необходимо его заменить 0.0, где у вас есть 1.0f, это должно быть 1.0 и так далее.

Компиляторы GLSL от некоторых поставщиков (которые остаются неназванными ...), как правило, относительно снисходительны и компилируют шейдеры с такими ошибками без каких-либо жалоб. Компиляторы других поставщиков более строгие в отношении ошибок отчетности для несоответствующего кода, как и должны.

Постфикс f является законным в GLSL ES 3.00 и более поздних версиях.

Это важно понимать, что, например 1.0 является константой типа float в GLSL, в отличие от C/C++, где это константа типа double. Поэтому, хотя более поздние версии GLSL допускают постфикс f, он абсолютно не функционирует, поскольку он не меняет тип константы.

Отсутствие версии GLSL ES (вплоть до текущего 3.2) поддерживает двойные значения. Только полный OpenGL 4.x поддерживает арифметику с двойной точностью в шейдерах. В OpenGL 4.x для констант типа double необходим постфикс lf или LF. Константы без постфикса все еще имеют тип float.

+0

Я пробовал это раньше, и ошибка затем вращалась вокруг цветовой переменной в шейдере. Есть ли потенциал для проблемы там? Я могу предоставить конкретный текст ошибки позже. Я сейчас вдали от своего терминала. Спасибо за вашу помощь. Это было очень информативно. – Runner5

Смежные вопросы