我正在尝试使用旧版OpenGL固定管道命令转换用C语言编写的程序。
我在尝试将一些数据传递到Vertex Shader中时遇到问题。我正在尝试使用最新的4.5命令,并且设法使用[
将我的顶点坐标数组“ vertices []”传递给Vertex Shader。glCreateVertexArrays(1, &vertex_array_object);
glBindVertexArray(vertex_array_object);
glCreateBuffers(1, &vertex_buffer);
glNamedBufferStorage(vertex_buffer, sizeof(verticies), verticies, GL_DYNAMIC_STORAGE_BIT);
glVertexArrayVertexBuffer(vertex_array_object, 0, vertex_buffer, 0, sizeof(float)*3);
glVertexArrayAttribFormat(vertex_array_object,0, 3, GL_FLOAT, GL_FALSE, 0);
glVertexArrayAttribBinding(vertex_array_object,0,0);
glEnableVertexArrayAttrib(vertex_array_object,0);
这一切都很好,我可以将顶点渲染为点。
除了传递顶点,我还需要为每个顶点传递一个附加的4个值的块,然后我希望将其从“顶点着色器”传递到“几何着色器”。我需要传递的值位于结构数组中(每个顶点1个),其中该结构定义为
typedef struct { /* Vertex vector data structure */
unsigned char v; /* Scaled magnitude value " */
char x; /* X Component of direction cosine */
char y; /* Y " " " " */
char z; /* Z " " " " */
} NVD;
我无法轻易更改此结构,因为它已在代码中的许多其他地方使用。
在顶点着色器中,我需要4个值作为范围内的整数
v (0->255)
x,y,z (-127 > 127)
我无法轻易更改此结构,因为它已在代码中的许多其他地方使用。
嗯,您将不得不这样做,因为您不能在着色器阶段之间使用struct
作为接口变量。您可以将数据作为单个ivec4
传递,每个组件都存储所需的值。尽管确实如此,但您应该只传递在着色器中计算的浮点值;无论哪种方式,每个顶点都将是128位,因此花时间量化数据毫无意义。
如果通过剖析显示此数据的大小是一个实际问题(并且使用GS all更有可能是性能问题),则可以将数据编码为单个uint
传递给GS,然后在另一端拆箱。