我正在尝试使这两个着色器正常工作。我什至让片段着色器显示红色而不是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
如您所见,编译进行得很好,但没有链接。怎么可能呢?
答案 0 :(得分:1)
您的片段着色器无法编译,因为在OpenGL ES 3.0中,不允许将整数常量分配给浮点变量。您必须分配一个浮点数:
rgba.a = 1;
rgba.a = 1.0;
此外,缺少用于浮点类型的精度限定符。实例:
precision mediump float;
请参见OpenGL ES Shading Language 3.00 Specification - 4.5.4 Default Precision Qualifiers:
对于浮点类型,片段语言没有默认的精度限定符。因此,对于浮点,浮点向量和矩阵变量声明,声明必须包含精度限定符,或者必须事先声明默认的浮点精度。