如何将每个顶点属性传递给GLSL着色器

时间:2013-02-27 01:24:45

标签: c++ opengl shader

如果可能,如何将自定义顶点属性发送到着色器并访问它?请注意,模型将使用VBO进行渲染。例如,假设我有一个顶点结构如下:

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;

如何为自定义属性执行此操作?

1 个答案:

答案 0 :(得分:1)

首先,您不能使用双精度浮点数,因为几乎没有任何GPU支持这些浮点数。所以,只需将结构的成员更改为浮动然后...

在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 ++中实例化struct数组,创建你的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段创建的着色器程序。