如何在顶点着色器中使用VBO数据作为位置数据,在片段着色器中使用统一数据作为颜色数据
How to use VBO data as position data in vertex shader and uniform data as color data in fragment shader
这是我的代码,它们是从《OpenGL编程指南》一书中的代码转换而来的:
GLuint VAOs,Buffers;
void init(){
glGenVertexArrays(1, VAOs);
glBindVertexArray(VAOs);
GLfloat vertices[6][2] = {
{-0.9f,-0.9f},
{0.85f,-0.90f},
{-0.90f, 0.85f},
{0.90f, -0.85f},
{0.90f,0.90f},
{-0.85f, 0.90f}
};
glGenBuffers(1, Buffers);
glBindBuffer(GL_ARRAY_BUFFER, Buffers);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
ShaderInfo shaders[] = { {GL_VERTEX_SHADER, "triangles.vert"},{GL_FRAGMENT_SHADER, "triangles.frag"} ,{GL_NONE, NULL} };
program = LoadShaders(shaders);
GLuint pos = glGetAttribLocation(program, "vposition");
glVertexAttribPointer(pos, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(pos);
GLuint index,b;
char *name[]={"color"};
GLfloat fcolor[4]={1.0,0.0,0.0,1.0};
glGetUniformIndices(program,1,(const char**)name,&index);
glGenBuffers(1, &b);
glBindBuffer(GL_UNIFORM_BUFFER, Buffers[ArrayBuffer]);
glBufferData(GL_UNIFORM_BUFFER, sizeof(fcolor), fcolor, GL_STATIC_DRAW);
glBindBufferBase(GL_UNIFORM_BUFFER, index, b);
glUseProgram(program);
}
这是顶点着色器:
#version 430 core
uniform vec4 fcolor;
layout(location=3)in vec4 vposition;
void
main()
{
vec4 p = vposition;
gl_Position = p;
}
这是片段着色器:
#version 430 core
uniform vec4 color;
out vec4 fColor;
void
main()
{
fColor = color;
}
我以为黑色背景上会有一个红色的三角形,但实际上只有一个黑色的窗口。我不明白为什么,请帮帮我!
uniform vec4 color;
不是统一块(另请参见统一缓冲区对象(
它只是一个统一变量(在默认的统一块中(。因此,您必须使用glUniform*
来设置该值。
glUseProgram(program);
glUniform4fv(index, 1, fcolor);
代码中的另一个错误是,作为数组缓冲区(Buffers[ArrayBuffer]
(的缓冲区对象绑定到了目标GL_UNIFORM_BUFFER
。统一缓冲区对象可能是b
:
glBindBuffer(GL_UNIFORM_BUFFER, Buffers[ArrayBuffer]);
glBindBuffer(GL_UNIFORM_BUFFER, b);
当然,您可以使用命名的统一缓冲区。在该示例中,绑定点由布局限定符设置。例如:
#version 430 core
layout (std140, binding = 1) uniform UB_color
{
vec4 color;
};
out vec4 fColor;
void main()
{
fColor = color;
}
GLuint ubo;
glGenBuffers(1, &ubo);
glBindBuffer(GL_UNIFORM_BUFFER, ubo);
glBufferData(GL_UNIFORM_BUFFER, sizeof(fcolor), fcolor, GL_STATIC_DRAW);
glBindBufferBase(GL_UNIFORM_BUFFER, 1, ubo); // 1 because of 'binding = 1'
如果您不想通过布局限定符设置统一的块绑定(无论出于何种原因(:
layout (std140, binding = 1) uniform UB_color
layout (std140) uniform UB_color
GLuint ubo_index = glGetUniformBlockIndex(program, "UB_color");
GLuint ubo_binding = 7; // arbitrary number
glUniformBlockBinding(program, ubo_index, ubo_binding);
glBindBufferBase(GL_UNIFORM_BUFFER, ubo_binding, ubo);
更换
layout(location=3)in vec4 vposition;
带有
layout(location=3)in vec2 vposition;
并取代
vec4 p = vposition
带有
vec4 p = vec4(vposition.x, vposition.y, 0.0, 1.0)
在此代码中:
glVertexAttribPointer(pos, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
您正在加载一个大小为2个浮动的顶点属性,然后在着色器中告诉它提供4个浮动(Vector4在GLSL中仅为4个浮动(。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 如何返回定义良好的内存部分?例如来自图像数据的像素的颜色值
- 如何在顶点着色器中使用VBO数据作为位置数据,在片段着色器中使用统一数据作为颜色数据
- GLSL 将颜色数据从片段着色器发送到顶点着色器似乎总是等于 0
- 如何从 GIFLIB 保存图像结构中获取 RGB 颜色数据
- 如何使用stb_image将像素颜色数据写入 BMP 图像文件?
- 如何在 QLabel 中以像素为单位放置颜色数据
- 读取 TGA 显示空值而不是颜色数据
- 渲染颜色数据到一个窗口,Win32
- 带alpha的WebP会丢失颜色通道数据
- 如何使用CreateDIBSection在BITMAPINFO中写入颜色数据
- 从指定坐标[x, y]处的位图数据获取像素颜色
- 将一组颜色数据保存为DS上的PNG文件