gpt4 book ai didi

c++ - OpenGL 统一缓冲区?

转载 作者:可可西里 更新时间:2023-11-01 18:38:01 24 4
gpt4 key购买 nike

我正在尝试使用统一缓冲区,但它没有按预期工作。我有两个统一的缓冲区,一个是照明,另一个是 Material 。问题是颜色不是它们应该的颜色,每次我移动相机时它们都会改变。当我使用普通 uniform 时,这个问题不存在。这里的图片显示了我的意思:When using uniform bufferswhen using normal uniforms !

这是我的片段着色器:

#version 400 // Fragment Shader
uniform layout(std140);

in vec3 EyePosition;
in vec3 EyeNormal;
in vec2 TexCoord;

out vec4 FragColor;

uniform sampler2D Texture;

uniform LightBlock
{
vec4 Position;
vec4 Intensity;
} Light;

uniform MaterialBlock
{
vec4 Ambient;
vec4 Diffuse;
} Material;

vec4 PointLight(in int i, in vec3 ECPosition, in vec3 ECNormal)
{
vec3 n = normalize(ECNormal);
vec3 s = normalize(Light.Position.xyz - ECPosition);

return Light.Intensity * (Material.Ambient + Material.Diffuse * max(dot(s, n), 0.0));
}

void main()
{
FragColor = texture(Texture, TexCoord);
FragColor *= PointLight(0, EyePosition, EyeNormal);
}

我不确定我是否做对了所有事情,但这是我创建统一缓冲区的方式:

glGenBuffers(1, &light_buffer);
glGenBuffers(1, &material_buffer);

glBindBuffer(GL_UNIFORM_BUFFER, light_buffer);
glBufferData(GL_UNIFORM_BUFFER, sizeof(LightBlock), nullptr, GL_DYNAMIC_DRAW);

glBindBuffer(GL_UNIFORM_BUFFER, material_buffer);
glBufferData(GL_UNIFORM_BUFFER, sizeof(MaterialBlock), nullptr, GL_DYNAMIC_DRAW);

GLuint program = Shaders.GetProgram();

light_index = glGetUniformBlockIndex(program, "LightBlock");
material_index = glGetUniformBlockIndex(program, "MaterialBlock");

glUniformBlockBinding(program, light_index, 0);
glUniformBlockBinding(program, material_index, 1);

glBindBufferBase(GL_UNIFORM_BUFFER, 0, light_buffer);
glBindBufferBase(GL_UNIFORM_BUFFER, 1, material_buffer);

编辑:这是我填充缓冲区的方式:

// Global structures
struct LightBlock
{
Vector4 Position; // Vector4 is a vector class I made
Vector4 Intensity;
};

struct MaterialBlock
{
Vector4 Ambient;
Vector4 Diffuse;
};

// This is called for every object rendered
LightBlock Light;
Light.Position = Vector3(0.0f, 5.0f, 5.0f) * Camera.GetCameraMatrix();
Light.Intensity = Vector4(1.0f);

glBindBuffer(GL_UNIFORM_BUFFER, light_buffer);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(LightBlock), &Light);

MaterialBlock Material;
Material.Diffuse = Vector4(1.0f);
Material.Ambient = Material.Diffuse * Vector4(0.3f);

glBindBuffer(GL_UNIFORM_BUFFER, material_buffer);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(MaterialBlock), &Material);

最佳答案

我遇到了同样的问题,但仅限于 AMD(而非 NVIDIA)。有趣的是,问题只发生在更改 View 矩阵时。

由于我有一个取决于 View 矩阵变化的可重复问题,我能够追踪到根本原因(进行艰苦的试验和错误)。在我的应用程序中更改 View 时,我会根据需要动态分配和释放一些 OpenGL 资源。在此过程中,会调用缓冲区 0 的 glDeleteBuffers()。如果我使用条件语句以免为缓冲区 0 调用 glDeleteBuffers,那么问题就会消失。

根据文档,缓冲区 0 将被 glDeleteBuffers 默默地忽略.我的猜测是 AMD 驱动程序中存在错误。

关于c++ - OpenGL 统一缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9155044/

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