gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:13:13 25 4
gpt4 key购买 nike

这是我的代码,它们是从《OpenGL Programming Guide》一书中的代码转换而来的:

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; 不是 Uniform block (另见 Uniform Buffer Object )。
它只是一个 Uniform变量(在默认统一 block 内)。所以你必须使用 glUniform*设置值。

glUseProgram(program);
glUniform4fv(index, 1, fcolor);

代码中的另一个错误是本应作为数组缓冲区的缓冲区对象 (Buffers[ArrayBuffer]) 绑定(bind)到目标 GL_UNIFORM_BUFFER。统一缓冲对象可能是b:

glBindBuffer(GL_UNIFORM_BUFFER, Buffers[ArrayBuffer]);

glBindBuffer(GL_UNIFORM_BUFFER, b);

当然你可以使用一个命名的Uniform Buffer .在示例中 Binding pointLayout Qualifier 设置.例如:

#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'

如果您不想通过布局限定符设置统一 block 绑定(bind)(无论出于何种原因):

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);

关于c++ - 如何在顶点着色器中使用 VBO 数据作为位置数据,在片段着色器中使用统一数据作为颜色数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58899232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com