繁体   English   中英

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

[英]Passing data to a GLSL Vertex Shader

我正在尝试使用旧版 OpenGL 固定管道命令转换用 C 编写的程序。

我一直试图将一些数据传递到顶点着色器中。 我正在尝试使用最新的 4.5 命令,并且我设法将我的顶点坐标数组“vertices []”传递给顶点着色器使用

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 更有可能是性能问题),您可以将数据编码为单个uint以传递给 GS,然后解包它在另一端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM