属性的多个缓冲区如何在openGL(ES)着色器和C ++ API中工作

彼得

我有一个众所周知的多维数据集示例,并且一直在编写一些代码来对其进行测试并了解有关着色器的更多信息。我的问题是关于如何在着色器中分配多个缓冲区以进行访问以及如何编写着色器代码以引用它们。那里的样本似乎依赖于某种隐式引用默认值,这些默认值隐藏了实际发生的情况以及如何在样本中对其进行操作。

我的缓冲区设置如下(数据省略)

        glGenBuffers(1, &vertexPosObject);
        glBindBuffer(GL_ARRAY_BUFFER, vertexPosObject);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,
            sizeof(Vec3f), (void*)0);

        /* load index buffer with array of indices */
        glGenBuffers(1, &indexBufferObject);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferObject);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

        /* load color buffer with array of colors */
        glGenBuffers(1, &colorBufferObject);
        glBindBuffer(GL_ARRAY_BUFFER, colorBufferObject);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertColors), vertColors, GL_STATIC_DRAW);

        glEnableVertexAttribArray(1);
        glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE,
            sizeof(Vec4f), 0);

有了这个,我得到了一个立方体图并且可以旋转它。用。

        Matrix4d modelView;
        double rot = rc.timing().frameTime()*.3;
        rot = fmod(rot, ARTD_M_PI * 2);
        modelView.setRotation(Vec3d(0, 1, 1), rot);
        artdGlUniformMatrix4(modelViewId, modelView); // convenience call

然后我可以在下面画

        glUseProgram(cubeShader);

        glBindBuffer(GL_ARRAY_BUFFER, vertexPosObject);
        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, colorBufferObject);
        glEnableVertexAttribArray(1);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferObject);

        const int vertexCount = 36;
        const int type = GL_UNSIGNED_INT; // unsigned short ??
        const int firstIndex = 0;

        // vertexCount is the number of verts in your vertex array object
        // firstIndex is the first index to use in an array of offsets (element index) into the vertex data.

        glDrawElements(GL_TRIANGLES, vertexCount, type, (void *)firstIndex);

        glDisableVertexAttribArray(0);
        glDisableVertexAttribArray(1);

我一直假设顶点数组被分配了一个“槽”

        glEnableVertexAttribArray(0);

插槽“ 0”隐含了着色器在输入顶点时所采用的方式。(???)

所以我想尝试将颜色数组分配给插槽“ 1”,将索引数组句柄直接传递到glDrawElements()并使用指向分配给插槽“ 0”的缓冲区的索引数组来检索着色器中输入的顶点

我一般来说,我假设一个人可能想要多个缓冲区来存储各种法线,颜色等,并且一个人需要访问这些缓冲区的值,以索引来寻址它们。因此,一般情况下的答案将是可取的。

我的问题是如何在着色器中访问着色器中的颜色数组缓冲区以及如何将其他缓冲区作为可索引数组访问?

如何将缓冲区绑定到各种着色器可访问的标识符,以及如何从着色器代码中的这些标识符访问它们。了解这些关系是关键。

当前,此着色器对可用于使用计算出的颜色绘制多维数据集。

    "uniform mat4 Projection;\n"
    "uniform mat4 Model;\n"

    "attribute vec4 vPosition;\n"
    "varying vec3 color;\n"
    "void main(){\n"
        "mat4 MVP = Model * Projection;\n"
        "gl_Position = vPosition * MVP;\n"
        "color = gl_Position.xyz + vec3(0.5);\n"
    "}\n"

片段着色器

   "precision mediump float;\n"
    "varying vec3 color;\n"
    "void main()\n"
    "{\n"
        "gl_FragColor = vec4 ( color, 1.0 );\n"
    "}\n"

赦免C ++字符串:)

谢谢 !!

拉比德76

如果要使用color属性,则必须向着色器添加新属性:

顶点着色器

attribute vec4 vPosition;
attribute vec4 vColor;

varying vec4 color;

uniform mat4 Projection;
uniform mat4 Model;

void main()
{
    mat4 MVP    = Model * Projection;
    gl_Position = vPosition * MVP;
    color       = vColor;
}

将shader程序链接后glLinkProgram,可以通过以下方式获取属性ind3ex glGetAttribLocation

GLuint cubeShader = ....;

glLinkProgram(cubeShader);

GLint pos_attr_i   = glGetAttribLocation(cubeShader, "vPosition");
GLint color_attr_i = glGetAttribLocation(cubeShader, "vColor");

这是其必须在使用该属性指数glVertexAttribPointer分别为glEnableVertexAttribArray

glBindBuffer(GL_ARRAY_BUFFER, vertexPosObject);
glVertexAttribPointer(pos_attr_i, 3, GL_FLOAT, GL_FALSE, sizeof(Vec3f), (void*)0);

glBindBuffer(GL_ARRAY_BUFFER, colorBufferObject);
glVertexAttribPointer(color_attr_i, 4, GL_FLOAT, GL_FALSE, sizeof(Vec4f), 0);

glEnableVertexAttribArray(pos_attr_i);
glEnableVertexAttribArray(color_attr_i);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在着色器存储缓冲区中初始化矩阵?

OpenGL-从顶点着色器访问缓冲区中的下3个顶点

如何从着色器中的着色器存储缓冲区对象获取sampler2D类型?

金属着色器在缓冲区中插入值

读取和写入片段着色器中的缓冲区

DirectX11 C ++着色器缓冲区在多边形布局描述中为空

如何在 OpenGL 中将多个纹理/缓冲区混合到一个纹理/缓冲区中?

在片段着色器中丢弃会阻止对模板缓冲区的修改吗?

自定义和通用顶点着色器属性在OpenGL和OpenGL ES中的使用

OpenGL ES如何在着色器中设置布尔值

如何在XCode中编写OpenGL ES片段着色器?

如何在OpenGL ES 2.0中模拟累积缓冲区(跟踪粒子效果)

如何在OpenGL ES 1.1中处理索引缓冲区

OpenGL的缓冲区如何工作?

如何在Android的着色器中声明OpenGL版本?

在GLSL顶点着色器中,您不仅可以访问顶点缓冲区,还可以访问索引缓冲区中顶点的索引吗?

如何在Vim中关闭单个缓冲区(在多个缓冲区中)?

具有乒乓缓冲区的多步着色器中的条带问题,在 ShaderToy 中不会发生

您可以将深度值写入计算着色器中的深度缓冲区吗?(Vulkan GLSLS)

Vulkan - 读取缓冲区中浮点着色器颜色值到 uchar 值的奇怪映射

GLSL错误:尽管已定义,但计算着色器中的未定义布局缓冲区变量

缓冲区如何在节点js中工作?

OpenGL工作着色器?

如何在Cython中的新型缓冲区对象中包装C指针和长度?

如何在C中打印缓冲区的内容?

如何在C中返回缓冲区地址

如何在流缓冲区C中添加参数

如何理解 C 中的 scanf 缓冲区和格式?

Android openGL ES 3.0着色器无法正常工作