Компилируются простые android шейдеры, но связывание не удается - PullRequest
1 голос
/ 11 июля 2020

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

public static final String videoVertex =
    "#version 300 es\n"+
    "precision mediump float;\n"+
    "layout (location = 0) in vec3 aPos;\n" +
    "layout (location = 1) in vec2 aTexCoord;\n" +
    "\n" +
    "out vec2 TexCoord;\n" +
    "\n" +
    "void main()\n" +
    "{\n" +
    "    gl_Position = vec4(aPos, 1.0);\n" +
    "    TexCoord = vec2(aTexCoord.x, aTexCoord.y);\n" +
    "}\n";

public static final String videoFragment =
    "#version 300 es\n"+
    "uniform float alpha;\n" +
    "uniform sampler2D sampler;\n"+
    "\n" +
    "in vec2 TexCoord;\n" +
    "out vec4 FragColor;\n" +
    "void main()\n" +
    "{\n" +
    "    vec4 rgba;\n" +
    "    rgba.rgb = texture(sampler, TexCoord).rgb;\n" +
    "    rgba.a = 1;\n" +
    "    FragColor = vec4(1.0f,0,0,1.0f);\n" +
    "    //FragColor = rgba;\n" +
    "}\n";

mProgram = GLES20.glCreateProgram();

int vertexShader = SimpleGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER, videoVertex);
int fragmentShader = SimpleGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER, videoFragment);

int[] compiled = new int[1];

GLES20.glAttachShader(mProgram, vertexShader);
GLES20.glGetShaderiv(vertexShader, GLES20.GL_COMPILE_STATUS, compiled, 0);
Log.d(TAG, "### vertex shader compilation: " + Arrays.toString(compiled));

GLES20.glAttachShader(mProgram, fragmentShader);
GLES20.glGetShaderiv(vertexShader, GLES20.GL_COMPILE_STATUS, compiled, 0);
Log.d(TAG, "### fragment shader compilation: " + Arrays.toString(compiled));

GLES20.glLinkProgram(mProgram);
int[] link = new int[1];
GLES20.glGetProgramiv(mProgram, GLES20.GL_LINK_STATUS, link, 0);
if (link[0] <= 0) {
    Log.d("### Load Program", "Linking Failed: " + link[0]);
}

Вот результат, который я получаю:

2020-07-11 01:57:17.318 22963-23004/com.example.mediacodecdecoderexample D/VideoRenderer: ### vertex shader compilation: [1]
2020-07-11 01:57:17.318 22963-23004/com.example.mediacodecdecoderexample D/VideoRenderer: ### fragment shader compilation: [1]
2020-07-11 01:57:17.318 22963-23004/com.example.mediacodecdecoderexample D/### Load Program: Linking Failed: 0

Как видите, компиляция прошла успешно, но не компоновка. Как такое возможно?

1 Ответ

1 голос
/ 11 июля 2020

Ваш фрагментный шейдер не компилируется, потому что в OpenGL ES 3.0 не разрешено назначать целочисленную константу переменной с плавающей запятой. Вам необходимо назначить плавающую точку:

rgba.a = 1;

rgba.a = 1.0;

Более того, отсутствует квалификатор точности для типов с плавающей запятой. Для экземпляра:

precision mediump float; 

См. Спецификация OpenGL ES Shading Language 3.00 - 4.5.4 Квалификаторы точности по умолчанию :

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

...