2013-02-27 2 views
0

가능한 경우 어떻게 셰이더에 사용자 지정 버텍스 속성을 보내고 액세스 할 수 있습니까? 모델은 VBO로 렌더링됩니다.꼭지점 속성을 GLSL 셰이더에 전달하는 방법

에 액세스하려면
struct myVertStruct{ 
    double x, y, z; // for spacial coords 
    double nx, ny, nz; // for normals 
    double u, v; // for texture coords 
    double a, b; // just a couple of custom properties 

, 말, 법선은, 하나는 쉐이더에서 호출 할 수 있습니다 :

varying vec3 normal; 

이이 사용자 지정 속성에 대해 수행 될 방법 예를 들어, 다음과 같이 내가 정점 구조를 갖고 있다고 ? 이 그냥 구조체의 멤버는 다음 떠 변경, 어떤 GPU.So에 대해 단지가 지원되지 않기 때문에

+4

1 단계 : * double * 사용을 중지하십시오. 2 단계 : 당신이 다른 속성들에 대해했던 것과 같은 방식으로합니다. '정상'은 특별하지 않습니다. 또한, 'varying vec3 normal'은 속성이 아닌 정점 셰이더 * 출력 *입니다. 그래서 당신의 질문은 매우 혼란 스럽습니다. –

+0

어떤 OpenGL 버전을 사용하고 있습니까? 이 코드는 OpenGL 2와 OpenGL 3+에서 약간 다릅니다. 또한 @NicolBolas가 이미 언급했듯이, 'varying'는 버텍스 쉐이더 입력에 대한 옵션이 아닙니다. –

답변

1

우선 해제, 당신은 배정 밀도를 사용할 수는

은 GLSL에서 같은 구조체를 정의 ... 수레 .

struct myVertStruct 
{ 
    float x, y, z; // for spacial coords 
    float nx, ny, nz; // for normals 
    float u, v; // for texture coords 
    float a, b; // just a couple of custom properties 
} myStructName; 

그런 다음, C에서 구조체의 배열을 인스턴스화/C++, 당신의 VBO를 만들고, 쉐이더로 결박 한 후, 그것을 위해 메모리를 할당 : 당신이 속성을 바인딩 할 때 다음

struct myVertStruct 
{ 
    float x, y, z; // for spacial coords 
    float nx, ny, nz; // for normals 
    float u, v; // for texture coords 
    float a, b; // just a couple of custom properties 
}; 

GLuint vboID; 
myVertStruct myStructs[100]; // just using 100 verts for the sake of the example 
// .... fill struct array; 

glGenBuffers(1,&vboID); 

:

glBindBuffer(GL_ARRAY_BUFFER, vboID); 
glVertexAttribPointer(0, sizeof(myVertStruct) * 100, GL_FLOAT, GL_FALSE, 0, &struct); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

... 그런 다음 위에서 사용한 glsl 세그먼트를 사용하여 만든 셰이더 프로그램에 vbo를 바인딩하십시오.

+1

이 기능이 제대로 작동합니까? 'myStructName'은'struct'이기 때문에'in' 한정자를 사용할 수 없습니다. 따라서이 값을 사용하여 셰이더에 값을 전달할 수는 없습니다. –

관련 문제