我在 Mac OSX 下工作,并试图通过 GLSL 着色器将图像映射到立方体上。
我显示立方体(和图像,当它不通过着色器时)的方法是:
glPushMatrix();
{
glTranslatef(position.getX(), position.getY(), position.getZ());
glRotatef(angle, axis.getX(), axis.getY(), axis.getZ());
if (bodyImage &&
textureCoords != 0 &&
[bodyImage lockTextureRepresentationWithColorSpace:CGColorSpaceCreateDeviceRGB() forBounds:[bodyImage imageBounds]]) {
[bodyImage bindTextureRepresentationToCGLContext:cgl_ctx textureUnit:GL_TEXTURE0 normalizeCoordinates:YES];
texture = [bodyImage textureName];
if(shader != nil) {
glUseProgramObjectARB([shader programObject]);
glUniform1iARB([shader getUniformLocation:"tex0"], 0);
} else {
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(3, GL_FLOAT, sizeof(btVector3), &textureCoords[0].getX());
}
}
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(btVector3), &vertices[0].getX());
glNormalPointer(GL_FLOAT, sizeof(btVector3), &normals[0].getX());
glDrawElements(GL_TRIANGLES, indicesCount, GL_UNSIGNED_INT, indices);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
if (bodyImage) {
if (shader != nil) {
glUseProgramObjectARB(NULL);
} else {
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
[bodyImage unbindTextureRepresentationFromCGLContext:cgl_ctx textureUnit:GL_TEXTURE0];
[bodyImage unlockTextureRepresentation];
}
}
glPopMatrix();
正如你所看到的,对于这个测试,我正在检查是否有一个着色器要应用于我的对象(它是一个非常有效的包装。)
如果没有着色器,我只启用 GL_TEXTURE_COORD_ARRAY,如果有我尝试将图像绑定到着色器中的 sampler2D 制服。
我使用的着色器非常简单:它只显示纹理。我在 Quartz Composer 下测试过,效果很好。
但是,在这里,它只显示黑色。
编辑
这是着色器...
顶点
varying vec2 texture_coordinate;
void main() {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
texture_coordinate = vec2(gl_MultiTexCoord0);
}
分段
varying vec2 texture_coordinate;
uniform sampler2D tex0;
void main()
{
gl_FragColor = gl_Color * texture2D(tex0, gl_TexCoord[0].xy);
}