如果可能,如何将自定义顶点属性发送到着色器并访问它?请注意,模型将使用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;
如何为自定义属性执行此操作?
答案 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段创建的着色器程序。