0

如果可能的话,如何将自定义顶点属性发送到着色器并访问它?请注意,模型将使用 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;

这将如何为自定义属性完成?

4

1 回答 1

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

于 2013-02-27T17:26:31.120 回答