2012-02-29 1 views
0

에 대한 쉐이더 포인터는이 데이터 구조입니다 :안드로이드 OGLES 2 : 나는 OGLES 2.</p> <p>에 쉐이더에 프로그램을 업그레이드하는 데 문제가 색

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

1.

, mContext 가리키는, 아마 void*로 선언 된 "userData에"필드를 포함합니다. 해당 필드에 실제 UserData 개체에 대한 포인터를 저장하고 있습니다. UserData*에서 void*로 변환 당신이 명시 적 캐스트가 필요 암시 적으로 작동하지만 void*에서 UserData*를 얻을 :

UserData *userData = reinterpret_cast<UserData*>(mContext->userData); 

reinterpret_cast 잠재적 위험합니다; 사용하는 경우 void*이 실제로 UserData*에서 왔는지 확인하십시오. 그렇지 않으면 나쁜 일이 발생합니다.

2.

오류 메시지가 모든 것을 말해 : esLoadProgram 유형 const char*의 인수를 기대하고 유형 GLbyte*의 인수를 전달하고 있습니다. 같이 적절하게 vShaderStrfShaderStr를 선언 :

const char *vShaderStr = 
    "uniform ... 
0

나는 그것을 변경, 귀하의 제안을 따라 필요한 경우 :

UserData *userData = static_cast<UserData*>(esContext->userData); 
... 
const char vShaderStr[] ={ 
    "uniform mat4 u_mvpMatrix;     \n" 
    "attribute vec4 a_position;     \n" 
    "void main()         \n" 
    "{           \n" 
    " gl_Position = u_mvpMatrix * a_position; \n" 
    "}           \n"}; 

감사합니다 많이!

관련 문제