gpt4 book ai didi

c# - glGetUniformLocation 对于结构中的 2/4 字段失败?

转载 作者:行者123 更新时间:2023-12-03 04:28:26 31 4
gpt4 key购买 nike

我在 GLSL 中定义了一个结构,如下所示:

struct Rect {
float x;
float y;
float width;
float height;
};

我想用作制服:

uniform Rect TextureRect;

因此,在我的代码中,我创建了一个制服数组:

_hudTexUniform = new[]
{
new Uniform(_hudShader, "TextureRect.x"),
new Uniform(_hudShader, "TextureRect.y"),
new Uniform(_hudShader, "TextureRect.width"),
new Uniform(_hudShader, "TextureRect.height"),
};

其构造函数定义如下:

public Uniform(ShaderProgram shaderProgram, string name)
{
if (shaderProgram == null) throw new ArgumentNullException("shaderProgram");
if (Regex.IsMatch(name, @"\s")) throw new ArgumentException("Cannot contain white space.", "name");
if (name.StartsWith("gl_")) throw new ArgumentException("Cannot start with reserved prefix \"gl_\"", "name");
Location = shaderProgram.GetUniformLocation(name);
if (Location < 0) throw new ArgumentException("Name does not correspond to an active uniform variable in program", "name");
}

xy 工作正常,但是当它达到 width 时,会抛出异常(“名称不对应...” ),即 glGetUniformLocation 返回 -1。

我没有看到任何拼写错误,而且我刚刚检查了 GLSL 4.1 规范,它看起来不像“宽度”或“高度”是关键字......那么为什么会失败呢?

最佳答案

为了方便视频驱动程序,如果着色器实际上没有使用所请求的统一(例如,完全剥离),则允许

glGetUniformLocation 返回 -1。这不是错误 - 通过 glUniform* 对制服所做的更改将被忽略。但这意味着您需要将 -1 视为有效的统一位置。

顺便说一句,这对于将着色器与渲染分离来说可能是一件好事 - 您的代码可以简单地向着色器抛出所有相关值,而不必担心着色器实际关心哪些值。这还意味着您可以测试着色器是否实际使用某个值,如果不需要,则首先不计算它。

关于c# - glGetUniformLocation 对于结构中的 2/4 字段失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9253766/

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