【发布时间】:2015-07-16 17:22:31
【问题描述】:
我在绘制简单三角形时遇到问题。我在 Android Native Activity 设置中正确安装了 OpenGL ES 2.0,因为我可以执行 glClear() 并且它可以工作。
当我尝试绘制具有 3 个顶点的三角形时,它要么在 glDrawArrays 调用时崩溃,要么如果我尝试执行 glDrawElements,则什么也没有发生,但我收到以下消息:GLES_V2//GLESv2Imp.cpp:glDrawElements:669 错误0x500
我查了一下,但我认为我没有任何无效的枚举,我已经检查了我的代码并进行了几天的试验,但绘图调用不起作用。我还读到如果 glDrawArrays 尝试访问错误的内存块会崩溃,但据我所知,我的设置是正确的。谁能帮我理解为什么它可能会崩溃?
这就是我的三角形函数的调用方式。这部分只是一个模型
start()
{
setTriangle();
}
renderLoop()
{
drawTriangle();
}
这是我的着色器:
static const std::string triVertShader = "\
attribute vec4 vPosition;\
void main()\
{\
gl_Position = vPosition;\
}\
";
static const std::string triFragShader = "\
precision mediump float;\
uniform vec4 vColor;\
void main()\
{\
gl_FragColor = vColor;\
}\
";
这是我编译它们和链接程序的地方。我没有包括我的检查,但着色器编译成功,程序链接成功:
GLuint LoadShaders(const std::string &vertexShader, const std::string &fragmentShader)
{
GLint result = GL_TRUE;
int infoLogLength;
//Create the shaders
GLuint vertShaderID = glCreateShader(GL_VERTEX_SHADER);
GLuint fragShaderID = glCreateShader(GL_FRAGMENT_SHADER);
const char * vertShaderSource = vertexShader.data();
const char * fragShaderSource = fragmentShader.data();
//Compile Vertex Shader
glShaderSource(vertShaderID, 1, &vertShaderSource, NULL);
glCompileShader(vertShaderID);
//Compile Fragment Shader
glShaderSource(fragShaderID, 1, &fragShaderSource, NULL);
glCompileShader(fragShaderID);
//Link the program
GLuint programID = glCreateProgram();
glAttachShader(programID, vertShaderID);
glAttachShader(programID, fragShaderID);
glBindAttribLocation(programID, 0, "vPosition");
glLinkProgram(programID);
// glDeleteShader(vertShaderID);
// glDeleteShader(fragShaderID);
return programID;
}
这是我设置缓冲区对象的地方:
void setTriangle()
{
glClearColor(0, 1, 0, 1);
GLfloat triVerts[] = { 0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f };
GLuint triVertBufferID;
glGenBuffers(1, &triVertBufferID);
glBindBuffer(GL_ARRAY_BUFFER, triVertBufferID);
glBufferData(GL_ARRAY_BUFFER,
sizeof(triVerts),
triVerts,
GL_STATIC_DRAW);
program = LoadShaders(triVertShader, triFragShader); //note: "program" is a global variable of type GLuint
}
这里是绘图调用:
void drawTriangle()
{
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(program);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
//glDrawElements(GL_TRIANGLES, 3, GL_FLOAT, (void*)0 );
//glDrawArrays always crashes immediately
glDrawArrays(GL_TRIANGLES, 0, 3);
}
【问题讨论】:
标签: android opengl-es android-ndk opengl-es-2.0