如何在顶点着色器中使用VBO数据作为位置数据,在片段着色器中使用统一数据作为颜色数据



这是我的代码,它们是从《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个浮动(。

最新更新