【问题标题】:GLSL fragment shader struct outGLSL片段着色器结构
【发布时间】:2013-08-31 23:34:03
【问题描述】:

我的 GLSL 着色器有问题。 当我想编译片段着色器部分时,我收到以下错误:

0:24: error(#181) Cannot be used with a structure: out
error(#273) 1 compilation errors. No code generated

所以问题在于我的输出变量,我假设。 这是我的片段着色器:

#version 410

uniform mat4 gWVP;
uniform mat4 gWorld;

uniform sampler2D gColorMap;                

in VSOutput
{
    vec3 WorldSpacePos;
    vec2 TexCoord;
    vec3 Normal;  
} FSin;


struct FSOutput
{                   
    vec3 WorldSpacePos;    
    vec3 Diffuse;     
    vec3 Normal;      
    vec3 TexCoord;
};

out FSOutput FSOut;

void main()
{                                           
    FSOut.WorldSpacePos = FSin.WorldSpacePos;                   
    FSOut.Diffuse      = texture(gColorMap, FSin.TexCoord).xyz; 
    FSOut.Normal       = normalize(FSin.Normal);                    
    FSOut.TexCoord     = vec3(FSin.TexCoord, 0.0);              
}

据我所知,应该可以在 OpenGL 4.0+ 中输出结构,不是吗?所以我没有收到错误,是驱动程序问题还是类似的问题? 我在带有 13.4 驱动程序的 Radeon HD 6950 上运行。

【问题讨论】:

  • 有些阶段允许您输出结构,片段着色器不是这些阶段之一。片段着色器的输出非常严格 - 最接近您想要的是使用 vec3 数组;这类似于旧的 gl_FragData [n] 构造的工作方式。

标签: opengl compilation glsl shader


【解决方案1】:

据我所知,应该可以在 OpenGL 4.0+ 中输出结构,不是吗?

不,不应该。

GLSL 规范对此非常明确:顶点着色器输入和片段着色器输出不能是结构体。来自 GLSL 4.4 规范,第 4.3.6 节:

片段输出只能是浮点、单精度浮点向量、有符号或无符号整数或整数向量,或任何这些的数组。将任何双精度类型、矩阵或结构声明为输出都是编译时错误。

它们也不能聚合到interface blocks,以防您想知道。它们必须是松散变量。

【讨论】:

  • 啊,好吧,那我只是误解了一些东西。好吧,实际上我从教程中得到了这个着色器的大部分内容。为什么他会解释错?
  • @C0dR:你能链接教程吗?也许这是一种误解,或者更可能是从 HLSL 着色器到 GLSL 的快速翻译。
  • 原教程使用glfx,但我打印出了glfx的“翻译”着色器:ogldev.atspace.co.uk/www/tutorial35/tutorial35.html
  • @C0dR:首先,这不是翻译后的着色器,这可以从它使用结构的事实中得到证明。要么,要么 GLfx 坏了。其次,您为什么要使用拒绝实际使用 OpenGL 的 OpenGL 教程?学习“GLfx 脚本”而不是实际的 GLSL 有什么好处?
  • 这是我找到的唯一一个关于延迟渲染内容的好(?)教程。那么 glfx 可能会被破坏吗?我尝试了每个公开版本
猜你喜欢
  • 1970-01-01
  • 2017-04-12
  • 2013-07-30
  • 1970-01-01
  • 2020-11-20
  • 2014-07-26
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
相关资源
最近更新 更多