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!" 之后,我正式困倦了的线索。

PROJECT SOURCE

项目 运行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 有一个博客,其中包含一个包含常见黑屏原因列表的条目。它应该能帮到你。

如果不是,请检查您的矩阵并确保您按正确顺序执行所有操作:)

我按照传统错误的顺序将一个矩阵与另一个矩阵相乘