2013-02-27 2 views
0

Как, по возможности, можно отправить собственное свойство вершин в шейдер и получить к нему доступ? Обратите внимание, что модель будет отображаться с помощью VBO. Например, скажем, у меня есть структура вершин следующим образом:Как передать атрибуты Per-Vertex в GLSL Shader

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; 

Как бы это было сделано для пользовательских свойств ?

+4

Шаг 1: * Прекратите использование удвоений *. Шаг 2: вы делаете это так же, как и для других атрибутов. «Нормальный» ничего особенного. Кроме того, 'изменение vec3 normal' является вершинным шейдером * output *, а не атрибутом. Поэтому ваш вопрос очень смущен. –

+0

Какую версию OpenGL вы используете? Код будет немного отличаться для OpenGL 2 и OpenGL 3+. Кроме того, как уже упоминалось @NicolBolas, «изменение» не является вариантом для ввода вершинного шейдера. –

ответ

1

Во-первых, вы не можете использовать двойной точности поплавки, поскольку они не поддерживаются только о каких-либо GPU.So, просто измените члены вашей структуры плавать тогда ...

Определение же структуры в 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); 

... Затем привяжите ваше vbo к программе шейдеров, которую вы создали, используя сегмент glsl, использованный выше.

+1

Вы уверены, что это работает? 'myStructName' не может использовать классификатор' in', так как это 'struct'. Таким образом, вы не можете использовать его для передачи значений в шейдер. –