【问题标题】:OpenGL how to set attribute in draw arraysOpenGL如何在绘制数组中设置属性
【发布时间】:2021-11-24 08:01:19
【问题描述】:

我有一个 GLfloat 数组,其中包含如下所示的数据:

GLfloat arr[] = {
     //position    //color
     300, 380, 0,  0, 1, 0,
     300, 300, 0,  1, 1, 0,
     380, 300, 0,  0, 1, 1,
     380, 380, 0,  1, 0, 1
};

我正在尝试用各自的颜色绘制 4 个点,目前我正在这样做:

glPointSize(10);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, arr);
glDrawArrays(GL_POINTS, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);

但我尝试修改它以接受颜色值失败了。

顶点和碎片着色器:

#version 330 core
out vec4 FragColor;
in vec3 ourColor;

void main()
{
    FragColor = vec4(ourColor, 1.0);
} 

#version 330 core
layout (location = 0) in vec4 position;
layout (location = 1) in vec3 color;

out vec3 ourColor;

uniform mat4 projection;

void main()
{
    gl_Position = projection * vec4(position.xy, 0.0, 1.0);
    ourColor = color;
}

【问题讨论】:

    标签: c++ opengl glsl glm-math


    【解决方案1】:

    您正在使用着色器程序。顶点属性的属性索引为0,颜色的索引为1。使用glVertexAttribPointer定义通用顶点属性数据的2个数组:

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, arr);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(flaot)*6, arr);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(flaot)*6, arr+3);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    

    属性的顶点数组由一个包含 6 个组件(x、y、z、r、g、b)的元组组成。因此,连续通用顶点属性之间的字节偏移量 (stride) 为 sizeof(flaot)*6 字节。
    第一个顶点的地址是arr,第一个颜色的地址是arr+3(分别为(unsigned char*)arr + sizeof(float)*3)。

    【讨论】:

    • 效果很好,我也尝试过这种方法,但我一定是搞砸了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多