Android OpenGL ES 2.0 w/ 本机代码输出黑屏
Android OpenGL ES 2.0 w/ Native Code Outputs Black Screen
我快要睡觉了,但在过去的 6 个小时左右的时间里我一直在为此挠头,经过无数次 "ooh that has to be the problem!" 之后,我正式困倦了的线索。
项目 运行s 在 android 上,此时应该在屏幕上显示一个正在移动的球体。我测试了代码,一切都应该有效!我什至有点怀疑的唯一部分是 OpenGL ES 2.0 的渲染和设置代码:
设置代码:
glGenBuffers(1, &vb);
glBindBuffer(GL_ARRAY_BUFFER, vb);
glBufferData(GL_ARRAY_BUFFER, DragonMesh->numVerts*12,
(GLvoid*)verts, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glGenBuffers(1, &ib);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, DragonMesh->numTris*6,
(GLvoid*)DragonMesh->vertIndices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
渲染代码:
glUseProgram(Shader->tech);
float col[] = {1.f, 0.f, 0.f, 1.0f};
glUniformMatrix4fv(Shader->mvpMatrix, 1, GL_FALSE,
(GLfloat*)ModelViewProjection.m);
glUniform4fv(Shader->color, 1, col);
glBindBuffer(GL_ARRAY_BUFFER, vb);
glVertexAttribPointer(Shader->position, 3, GL_FLOAT, GL_FALSE, 12, 0);
glEnableVertexAttribArray(Shader->position);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib);
glDrawElements(GL_TRIANGLES, DragonMesh->numTris*3, GL_UNSIGNED_SHORT, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
其中 ModelViewProjection.m 是一个浮点数[4][4],而 verts 是一个浮点指针,指向构成每个位置坐标的一组连续值。
我正确设置了我的着色器,链接和构建它们没有错误(我使用 OpenGL 的相关错误检查调用检查了错误)。
我还认为它可能是我的设备(LG Optimus S 运行ning 2.3.3,但 phone 说它支持 OpenGL-ES 2.0)。
无论如何,当我 运行 它时,只有黑屏。
如果你能帮助我,我将不胜感激。
编辑:固定参数 GL_UNSIGNED_INT 而不是 GL_UNSIGNED_SHORT(尽管很遗憾,问题仍然存在)。
EDIT2:我有线索了!我会在下班回家时尝试一下,但在计算我的投影时我没有将度数转换为弧度 - 这是一件坏事。很糟糕的事情。
EDIT3:不
EDIT4:我已经对 repo 进行了相当多的更新,在每个角落都添加了错误检查并在此过程中修复了一些错误。但是屏幕仍然是黑色的......如果有人偶然发现这个,我强烈建议检查回购协议,因为黑屏可能意味着任何事情。再次感谢任何花时间阅读本文的人! (我还意识到我留下了一些临时变化,例如垂直 fov = 0,并且 center/eye 具有相同的位置。暂时忽略它们)。
EDIT5:意识到我可能以错误的顺序将我的 Eye 翻译乘以 LookAt 变换。我下班回来会在下午 6 点左右查看。
就是这样!!!几个星期以来我一直黑屏,这是因为我以错误的顺序乘以翻译。如果有人无意中发现了这个问题,想要修复黑屏,评论此问题的人 post 有一个博客,其中包含一个包含常见黑屏原因列表的条目。它应该能帮到你。
如果不是,请检查您的矩阵并确保您按正确顺序执行所有操作:)
我按照传统错误的顺序将一个矩阵与另一个矩阵相乘
我快要睡觉了,但在过去的 6 个小时左右的时间里我一直在为此挠头,经过无数次 "ooh that has to be the problem!" 之后,我正式困倦了的线索。
项目 运行s 在 android 上,此时应该在屏幕上显示一个正在移动的球体。我测试了代码,一切都应该有效!我什至有点怀疑的唯一部分是 OpenGL ES 2.0 的渲染和设置代码:
设置代码:
glGenBuffers(1, &vb);
glBindBuffer(GL_ARRAY_BUFFER, vb);
glBufferData(GL_ARRAY_BUFFER, DragonMesh->numVerts*12,
(GLvoid*)verts, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glGenBuffers(1, &ib);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, DragonMesh->numTris*6,
(GLvoid*)DragonMesh->vertIndices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
渲染代码:
glUseProgram(Shader->tech);
float col[] = {1.f, 0.f, 0.f, 1.0f};
glUniformMatrix4fv(Shader->mvpMatrix, 1, GL_FALSE,
(GLfloat*)ModelViewProjection.m);
glUniform4fv(Shader->color, 1, col);
glBindBuffer(GL_ARRAY_BUFFER, vb);
glVertexAttribPointer(Shader->position, 3, GL_FLOAT, GL_FALSE, 12, 0);
glEnableVertexAttribArray(Shader->position);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib);
glDrawElements(GL_TRIANGLES, DragonMesh->numTris*3, GL_UNSIGNED_SHORT, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
其中 ModelViewProjection.m 是一个浮点数[4][4],而 verts 是一个浮点指针,指向构成每个位置坐标的一组连续值。
我正确设置了我的着色器,链接和构建它们没有错误(我使用 OpenGL 的相关错误检查调用检查了错误)。
我还认为它可能是我的设备(LG Optimus S 运行ning 2.3.3,但 phone 说它支持 OpenGL-ES 2.0)。
无论如何,当我 运行 它时,只有黑屏。
如果你能帮助我,我将不胜感激。
编辑:固定参数 GL_UNSIGNED_INT 而不是 GL_UNSIGNED_SHORT(尽管很遗憾,问题仍然存在)。
EDIT2:我有线索了!我会在下班回家时尝试一下,但在计算我的投影时我没有将度数转换为弧度 - 这是一件坏事。很糟糕的事情。
EDIT3:不
EDIT4:我已经对 repo 进行了相当多的更新,在每个角落都添加了错误检查并在此过程中修复了一些错误。但是屏幕仍然是黑色的......如果有人偶然发现这个,我强烈建议检查回购协议,因为黑屏可能意味着任何事情。再次感谢任何花时间阅读本文的人! (我还意识到我留下了一些临时变化,例如垂直 fov = 0,并且 center/eye 具有相同的位置。暂时忽略它们)。
EDIT5:意识到我可能以错误的顺序将我的 Eye 翻译乘以 LookAt 变换。我下班回来会在下午 6 点左右查看。
就是这样!!!几个星期以来我一直黑屏,这是因为我以错误的顺序乘以翻译。如果有人无意中发现了这个问题,想要修复黑屏,评论此问题的人 post 有一个博客,其中包含一个包含常见黑屏原因列表的条目。它应该能帮到你。
如果不是,请检查您的矩阵并确保您按正确顺序执行所有操作:)
我按照传统错误的顺序将一个矩阵与另一个矩阵相乘