将数据传递到GLSL顶点着色器

问题描述 投票:0回答:1

我正在尝试使用旧版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)
c opengl glsl shader
1个回答
0
投票

我无法轻易更改此结构,因为它已在代码中的许多其他地方使用。

嗯,您将不得不这样做,因为您不能在着色器阶段之间使用struct作为接口变量。您可以将数据作为单个ivec4传递,每个组件都存储所需的值。尽管确实如此,但您应该只传递在着色器中计算的浮点值;无论哪种方式,每个顶点都将是128位,因此花时间量化数据毫无意义。

如果通过剖析显示此数据的大小是一个实际问题(并且使用GS all更有可能是性能问题),则可以将数据编码为单个uint传递给GS,然后在另一端拆箱。

© www.soinside.com 2019 - 2024. All rights reserved.