gpt4 book ai didi

opengl - 结构体中的 GLSL Sampler2D

转载 作者:行者123 更新时间:2023-12-02 06:29:42 27 4
gpt4 key购买 nike

在GLSL中,当我尝试将带有sampler2D属性的统一结构传递给向前声明的函数时,似乎存在着色器的链接错误。如果我删除前向声明并将函数移至 main 之上,则代码将有效。这是非法代码吗?

#version 330 core

in vec2 texcoords;
out vec4 color;

struct Material{
sampler2D tex; // Sampler inside a struct
};

uniform Material material;

// Forward Declaration
vec4 add(Material m);

void main() {
color = add(material);
}

// Function Definition
vec4 add(Material m) {
return vec4(texture(m.tex, texcoords));
}

// C++
glUniform1f(glGetUniformLocation(shader, "material.tex"), 0);
glBindTexture(GL_TEXTURE_2D, texture);

编辑:经过一番搜索后,这似乎是 AMD 驱动程序中的一个错误。我个人使用的是ATI Mobility Radeon HD 4670,它已经很旧了,但它仍然运行 OpenGL 3.3。在AMD的论坛上我发现了similar post ,因此了解 AMD 显卡的大小会很有趣。因为如果您在 Intel 或 NVidia 上进行开发,那么您如何知道您的着色器无法在某些 AMD 显卡上编译?我们是否应该保持安全,不要在带有采样器的结构上使用原型(prototype),或者甚至不将采样器完全放入结构中?...还值得注意的是,WebGL甚至不允许在内部使用采样器结构体。

错误消息:

Vertex shader(s) failed to link, fragment shader(s) failed to link.
unexpected error.
unexpected error.

最佳答案

这实际上不应该起作用,因为您无法实例化包含不透明数据类型(采样器、图像、原子计数器)的结构。使用不透明类型作为统一结构是可以接受的,但不能通过传递 Material 实例来实现函数 add (...)。 p>

数据类型 (GLSL) - Opaque Types

Variables of opaque types can only be declared in one of two ways. They can be declared at global scope, as a uniform​ variables. Such variables can be arrays of the opaque type. They can be declared as members of a struct, but if so, then the struct can only be used to declare a uniform​ variable (or to declare a member of a struct/array that itself a uniform variable). They cannot be part of a buffer-backed interface block or an input/output variable, either directly or indirectly.

<小时/>

对代码的此更改应该适用于所有兼容的 OpenGL 实现:

// Must be in, because you cannot assign values to an opaque type.
vec4 add (in sampler2D tex) {
return vec4(texture(tex, texcoords));
}

这也可以工作,因为它使用 material.tex 制服中的采样器:

vec4 add (void) {
return vec4(texture(material.tex, texcoords));
}

关于opengl - 结构体中的 GLSL Sampler2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25474625/

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