我有一个 book “Pragmatic OpenGL ES 2 for Android”,作者:Kevin Brothaler。我刚开始阅读它并做教程。
在第 4 章关于添加颜色和阴影的教程之前,一切都很好。
所以第 3 章代码是 here (有很多东西所以我添加了一个链接)。 一切都很好。
在第 4 章中,我们正在改变绘制这些东西的方式和着色器。
而且只有黑屏而不是这么好的画面
首先,我们改变了着色器
顶点着色器
attribute vec4 a_Position;
attribute vec4 a_Color;
varying vec4 v_Color;
void main()
{
v_Color = a_Color;
gl_Position = a_Position;
gl_PointSize = 10.0;
}
帧着色器
precision mediump float;
varying vec4 v_Color;
void main(){
gl_FragColor = v_Color;
}
我们还在 Render 类中添加了新内容并删除了一些内容。
变量
private static final int POSITION_COMPONENT_COUNT=2;
private static final int BYTES_PER_FLOAT=4;
private static final String A_COLOR="a_Color";
private static final int COLOR_COMPONENT_COUNT=3;
private static final int STRIDE = (POSITION_COMPONENT_COUNT+COLOR_COMPONENT_COUNT)*BYTES_PER_FLOAT;
private int aColorLocation;
以这种方式改变方法(thats 之前是怎样的)
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
String vertexShaderSource = TextResourceReader.readTextFileFromResource(context, R.raw.simple_vertex_shader);
String fragmentShaderSource = TextResourceReader.readTextFileFromResource(context, R.raw.simple_fragment_shader);
int vertexShader = ShaderHelper.compileVertexShader(vertexShaderSource);
int fragmentShader = ShaderHelper.compileFragmentShader(fragmentShaderSource);
program = ShaderHelper.linkProgram(vertexShader, fragmentShader);
if(LoggerConfig.ON){
ShaderHelper.validateProgram(program);
}
glUseProgram(program);
aPositionLocation = glGetAttribLocation(program, A_POSITION);
aColorLocation = glGetAttribLocation(program, A_COLOR);
vertexData.position(0);
glVertexAttribPointer(aPositionLocation,POSITION_COMPONENT_COUNT,GL_FLOAT,
false, STRIDE, vertexData);
glEnableVertexAttribArray(aColorLocation);
vertexData.position(POSITION_COMPONENT_COUNT);
glVertexAttribPointer(aColorLocation, COLOR_COMPONENT_COUNT,GL_FLOAT,
false,STRIDE,vertexData);
}
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 6);
//с 6, 2 пары
glDrawArrays(GL_LINES,6,2);
//Draw the first mallet blue.
glDrawArrays(GL_POINTS,8,1);
//Draw the second mallet red.
glDrawArrays(GL_POINTS,9,1);
}
public AirHockeyRenderer(Context context){
this.context=context;
float[] tableVerticesWithTriangles={
//TriangleFan
0f, 0f, 1f, 1f, 1f,
-0.5f,-0.5f, 0.7f, 0.7f, 0.7f,
0.5f,-0.5f, 0.7f, 0.7f, 0.7f,
0.5f, 0.5f, 0.7f, 0.7f, 0.7f,
-0.5f, 0.5f, 0.7f, 0.7f, 0.7f,
-0.5f,-0.5f, 0.7f, 0.7f, 0.7f,
//Line1
-0.5f,0f,1f, 0f, 0f,
0.5f,0f, 1f, 0f, 0f,
//Mallets
0f,-0.25f,0f,0f,1f,
0f, 0.25f,1f,0f,0f
};
vertexData=ByteBuffer
.allocateDirect(tableVerticesWithTriangles.length*BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer();
vertexData.put(tableVerticesWithTriangles);
}
怎么了?为什么会出现黑屏?也许我错过了什么?
完整的 repo 是 here
更新: 我跑 this实际代码
UPD2:
Reto Koradi 注意到我忘记在代码中添加 glEnableVertexAttribArray(aPositionLocation);
。
我添加了它,现在有一个白色像素的黑屏
更新 3: last updates are here
UPD4: 输出错误!
[2014-08-21 18:17:00 - Emulator] sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glAttachShader:156 error 0x501 [2014-08-21 18:17:00 - Emulator] sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glValidateProgram:1931 error 0x501 [2014-08-21 18:17:00 - Emulator] sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetProgramiv:1148 error 0x501 [2014-08-21 18:17:00 - Emulator] sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetProgramiv:1148 error 0x501 [2014-08-21 18:17:00 - Emulator] sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetAttribLocation:825 error 0x501 [2014-08-21 18:17:00 - Emulator] sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetAttribLocation:825 error 0x501
最佳答案
我唯一看不到的是代码从不启用位置顶点属性。此调用应在 onSurfaceCreated()
中,其中设置了顶点属性:
glEnableVertexAttribArray(aPositionLocation);
关于java - Kevin Brothaler OpenGL ES 2教程代码有错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25348958/