我试图通过NDK绘制GLES 2.0,除了在C ++中创建表面外做任何事情,但屏幕上没有任何东西在绘制......我无法弄清楚原因。
我已经尝试/验证了许多不同的东西,但仍然不知所措。
我最后几次猜测是这些:
我的纹理现在以某种方式与屏幕兼容:
我加载这样的纹理:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->GetPixels());
但默认的GLSurfaceView格式为RGB_565
我试过这个没有成功:
mGLView.getHolder().setFormat(PixelFormat.RGBA_8888);
还有这个:
glTexImage2D(GL_TEXTURE_2D, 0, GL_UNSIGNED_SHORT_5_6_5, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->GetPixels());
纹理格式可能与问题有关吗?我没有参考,因为Android SDK完全抽象出来了。
这是我使用的着色器:
const char *vertexShader = "\
uniform mat4 uMtxProjection; \
uniform mat4 uMtxModelView; \
attribute vec2 aPosition; \
attribute vec2 aTexCoord; \
varying vec2 vTexCoord; \
void main() \
{ \
gl_Position = uMtxProjection * (uMtxModelView * vec4(aPosition.x, aPosition.y, 0.0, 1.0)); \
vTexCoord = aTexCoord; \
}";
const char *fragmentShader = "\
precision mediump float; \
varying vec2 vTexCoord; \
uniform sampler2D sTexture; \
void main() \
{ \
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); \
}";
经过进一步测试,并删除纹理(只用红色填充三角形)我可以看到每次运行应用程序时扭曲的红色框闪烁3次,然后屏幕变为空白= /
和邻位矩阵:
Mat4 Ortho2D(float left, float right, float bottom, T top, float zNear, float zFar)
{
float dx = right - left;
float dy = top - bottom;
float dz = zFar - zNear;
// avoid division by zero
float tx = (dx != 0) ? -(right + left) / dx : 0;
float ty = (dy != 0) ? -(top + bottom) / dy : 0;
float tz = (dz != 0) ? -(zFar + zNear) / dz : 0;
return Mat4(2.0f / dx, 0, 0, tx,
0, 2.0f / dy, 0, ty,
0, 0, -2.0f / dz, tz,
0, 0, 0, 1);
}
答案 0 :(得分:0)
实际上,我不确定究竟发生了什么,但是我改变的东西解决了这个问题= / 我试着回过头来重新打破它,但是不能......
但是作为参考,我无法保证什么被打破,但我可以肯定地说,问题既不是纹理,也不是着色器。即使默认曲面视图设置为RGB_565,使用以下行也可以在NDK中创建纹理, 工作alpha。
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->GetPixels());
我使用的投影矩阵也很好,因为我直接从openGL规范中复制它。
我注意到在工作时调用glEnable(TEXTURE_2D)导致错误(无效枚举),因为它与opengl的固定功能管道有关,而我正在使用GLES2.0 ...我正在复制我的一些来自固定功能实现GLES1的旧代码。所以我能想到的是,我使用旧代码= /
导致gl以某种方式崩溃