从顶点数据中传入顶点位置和顶点颜色

Posted keguniang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从顶点数据中传入顶点位置和顶点颜色相关的知识,希望对你有一定的参考价值。

一、目的:不需要在着色器中指定图形的颜色,直接在顶点数据中指定颜色

//画三角形的顶点数组
float vertices[] = {
  //位置      //颜色
  -0.5f, -0.5f, 0.0f,1.0f,0.0f,0.0f,
  0.5f, -0.5f,0.0f,0.0f,1.0f,0.0f,
  0.0f,0.5f,0.0f,0.0f,0.0f,1.0f
};

二、

由于现在有更多的数据要发送到顶点着色器,我们有必要去调整一下顶点着色器,使它能够接收颜色值作为一个顶点属性输入。需要注意的是我们用layout标识符来把aColor属性的位置值设置为1:

顶点着色器:

 1 #version 330 core
 2 layout (location = 0) in vec3 aPos;   // 位置变量的属性位置值为 0 
 3 layout (location = 1) in vec3 aColor; // 颜色变量的属性位置值为 1
 4 
 5 out vec3 ourColor; // 向片段着色器输出一个颜色
 6 
 7 void main()
 8 {
 9     gl_Position = vec4(aPos, 1.0);
10     ourColor = aColor; // 将ourColor设置为我们从顶点数据那里得到的输入颜色
11 }

片元着色器:

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

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

三、

因为我们添加了另一个顶点属性,并且更新了VBO的内存,我们就必须重新配置顶点属性指针。

1 // 位置属性
2 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
3 glEnableVertexAttribArray(0);
4 // 颜色属性
5 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));
6 glEnableVertexAttribArray(1);

达到的效果:

技术分享图片

 







以上是关于从顶点数据中传入顶点位置和顶点颜色的主要内容,如果未能解决你的问题,请参考以下文章

根据顶点世界位置Y坐标修改Metal片段着色

顶点着色器的绘制操作

如何将数据从顶点着色器传递到片段着色器,中间有着色器[重复]

Unity Shaders and Effects Cookbook (7-1) 在Surface Shader 中 访问 顶点颜色

如何在片段着色器中找到 4 个顶点之间的插值位置?

片段着色器是不是处理来自顶点着色器的所有像素?