我在将程序升级到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*的参数。适当声明您的vShaderStrfShaderStr,如下所示:

const char *vShaderStr =
    "uniform ...

07-28 03:25
查看更多