我在将程序升级到OGLES 2中的着色器时遇到问题。
这是数据结构:
namespace packt {
class GraphicsService {
public:
...
struct ESMatrix{ GLfloat m[4][4]; };
typedef struct
{ // Handle to a program object
GLuint programObject;
// Attribute locations
GLint positionLoc;
// Uniform locations
GLint mvpLoc;
// Vertex data
GLfloat *vertices;
GLuint *indices;
int numIndices;
// Rotation angle
GLfloat angle;
// MVP matrix
ESMatrix mvpMatrix;
} UserData;
...
}
}
在android_main中设置上下文:
packt::GraphicsService lGraphicsService(pApplication,&lTimeService);
packt::Context lContext = { &lGraphicsService, &lTimeService };
但是,而不是使用不属于OGLES 2的glColor4f,现在我们尝试用着色器替换该命令。设置方法如下:
void GraphicsService::setup() {
glEnable(GL_TEXTURE_2D);
GLbyte vShaderStr[] =
"uniform mat4 u_mvpMatrix; \n"
"attribute vec4 a_position; \n"
"void main() \n"
"{ \n"
" gl_Position = u_mvpMatrix * a_position; \n"
"} \n";
GLbyte fShaderStr[] =
"precision mediump float; \n"
"void main() \n"
"{ \n"
" gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 ); \n"
"} \n";
// Load the shaders and get a linked program object
// replaced :: //glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
UserData *userData = mContext->userData;
userData->programObject = esLoadProgram (vShaderStr, fShaderStr);
glDisable(GL_DEPTH_TEST);
}
这给出了以下编译器的消息:
error: UserData *userData = mContext->userData;
- 'void*' is not a pointer-to-object type
error: userData->programObject = esLoadProgram (vShaderStr, fShaderStr);
- invalid conversion from 'GLbyte*' to 'const char*'
- initializing argument 1 of 'GLuint esLoadProgram(const char*, const char*)'
- initializing argument 2 of 'GLuint esLoadProgram(const char*, const char*)'
有什么建议如何解决吗?高度赞赏所有评论。
最佳答案
1。mContext
指向的上下文对象包含一个“ userData”字段,该字段可能已声明为void*
。您正在该字段中存储指向实际UserData
对象的指针。从UserData*
到void*
的转换是隐式工作的,但是要从UserData*
获得void*
,则需要显式强制转换:
UserData *userData = reinterpret_cast<UserData*>( mContext->userData );
请注意,
reinterpret_cast
有潜在的危险;使用它时,请首先确保您的void*
确实来自UserData*
,否则会发生不良情况。2。
错误消息说明了一切:
esLoadProgram
需要类型为const char*
的参数,并且您正在传递类型为GLbyte*
的参数。适当声明您的vShaderStr
和fShaderStr
,如下所示:const char *vShaderStr =
"uniform ...