我得到了Kevin Brothaler的book“实用的OpenGL ES 2 for Android”。我刚开始阅读它并做教程。
在第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;
}
Frament shader
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);
}
什么错了?为什么有黑屏?也许我错过了什么?
完整回购是here
UPD: 我实际运行this代码
UPD2:
正如Reto Koradi注意到我忘了在代码中添加glEnableVertexAttribArray(aPositionLocation);
。
我添加了它,现在有一个白色像素的黑屏
UPD3: last updates are here
UPD4: 输出错误!
[2014-08-21 18:17:00 - 模拟器] SDK /仿真器/的OpenGL /主机/库/翻译/ GLES_V2 / GLESv2Imp.cpp:glAttachShader:156 错误0x501 [2014-08-21 18:17:00 - 模拟器] SDK /模拟器/ OpenGL的/主机/库/转换器/ GLES_V2 / GLESv2Imp.cpp:glValidateProgram:1931年 错误0x501 [2014-08-21 18:17:00 - 模拟器] SDK /模拟器/ OpenGL的/主机/库/转换器/ GLES_V2 / GLESv2Imp.cpp:glGetProgramiv:1148 错误0x501 [2014-08-21 18:17:00 - 模拟器] SDK /模拟器/ OpenGL的/主机/库/转换器/ GLES_V2 / GLESv2Imp.cpp:glGetProgramiv:1148 错误0x501 [2014-08-21 18:17:00 - 模拟器] SDK /模拟器/ OpenGL的/主机/库/转换器/ GLES_V2 / GLESv2Imp.cpp:glGetAttribLocation:825 错误0x501 [2014-08-21 18:17:00 - 模拟器] SDK /模拟器/ OpenGL的/主机/库/转换器/ GLES_V2 / GLESv2Imp.cpp:glGetAttribLocation:825 错误0x501
答案 0 :(得分:2)
我唯一缺少的是代码永远不会启用位置顶点属性。此调用应位于onSurfaceCreated()
,其中设置了顶点属性:
glEnableVertexAttribArray(aPositionLocation);
答案 1 :(得分:1)
将glEnableVertexAttribArray(aColorLocation);
移至glVertexAttribPointer(aColorLocation, COLOR_COMPONENT_COUNT,GL_FLOAT,
false,STRIDE,vertexData);
以下
并将其替换为glEnableVertexAttribArray(aPositionLocation)
OnSurfaceCreate
这就像下面的
vertexData.position(0);
glVertexAttribPointer(aPositionLocation,POSITION_COMPONENT_COUNT,GL_FLOAT,false,STRIDE,vertexData);
glEnableVertexAttribArray(aPositionLocation);
vertexData.position(POSITION_COMPONENT_COUNT);
glVertexAttribPointer(aColorLocation,COLOR_COMPONENT_COUNT,GL_FLOAT,false,STRIDE,vertexData);
glEnableVertexAttribArray(aColorLocation);