【问题标题】:Transforming glsl 150 to 120将 glsl 150 转换为 120
【发布时间】:2012-10-24 05:34:22
【问题描述】:

我有几个要在我的 PC 上运行的示例。问题是它们是用 glsl 目标 150 编写的,而我的 PC 只支持 120 版本。我很确定程序本身足够简单,不需要任何 OpenGL 3.1 的扩展功能。我找到了一些关于应该采取哪些步骤来转换 glsl 的信息(例如,更改为属性,更改为变量)但它仍然没有编译(实际上是否有可能以某种方式从中获得有意义的错误消息?)。

原始.vert

#version 150
in  vec2 in_Position;
in  vec3 in_Color;
out vec3 ex_Color;
void main(void) {
    gl_Position = vec4(in_Position.x, in_Position.y, 0.0, 1.0);
    ex_Color = in_Color;
}

原始.frag

#version 150
precision highp float;

in  vec3 ex_Color;
out vec4 gl_FragColor;

void main(void) {
    gl_FragColor = vec4(ex_Color,1.0);
}

改变了.vert

#version 120 
attribute  vec2 in_Position; 
attribute  vec3 in_Color; 
varying vec3 ex_Color; 
void main(void) { 
    gl_Position = vec4(in_Position.x, in_Position.y, 0.0, 1.0); 
    ex_Color = in_Color; 
}

改变了.frag

#version 120 
precision highp float; 

attribute  vec3 ex_Color; 

void main(void) { 
    gl_FragColor = vec4(ex_Color,1.0); 
} 

那么任何人都可以在这里发现问题吗?

【问题讨论】:

  • 您是否有任何错误信息可以在您的问题中引用,无论它对您是否有意义?
  • "真的有可能从中得到有意义的错误信息吗?" Did you get the infolog?
  • 最初我只是收到一条消息,说我正在链接一个未编译的着色器,没有别的。
  • GLSL 150 着色器不应编译。 gl_Position、gl_FragColor 已从 >= 150 中删除。并且 gl_ 前缀是保留的,如果您尝试使用它应该会引发错误。

标签: opengl glsl


【解决方案1】:

要获取编译/链接错误消息,您需要对着色器使用命令glGetShaderInfoLog,对程序使用glGetProgramInfoLog

这些会告诉你你的具体错误是什么。

只是试探一下错误可能是什么,您在片段着色器中声明了一个attribute 输入,我认为它应该是一个varying。属性用于数据->顶点着色器,变化用于顶点着色器->片段着色器。

glsl 120 规范还提到精度限定符是“保留供将来使用”,因此它可能不适用于版本 120。您可以省略它。

但无论如何,您仍然应该熟悉 infolog 功能,您最终肯定会需要它们。

【讨论】:

  • 谢谢。你发现了我的两个问题。我不明白的一件事是,当我们只是为旧版本重写所有内容时,这个属性和变量是如何工作的。我的想法是 out > 变化和 in > 属性。在这种情况下,初始代码是错误的还是我遗漏了其他东西?
  • 我的想法是 out > 变化和 in > 属性。,这适用于顶点着色器,不适用于片段着色器。变化是片段着色器的输入。
【解决方案2】:

您可以通过检索“信息日志”来获取编译错误:

GLuint nVertexShader, nPixelShader;   // handles to objects
GLint  vertCompiled, fragCompiled;    // status values
GLint  linked;

glCompileShader(nVertexShader);
glGetShaderiv(nVertexShader, GL_COMPILE_STATUS, &vertCompiled);

如果 vertCompiled(或 fragCompile)== 0,这样做看看为什么:

int infologLength = 0;
int charsWritten  = 0;

glGetShaderiv(nVertexShader, GL_INFO_LOG_LENGTH, &infologLength);

if (infologLength > 0)
{
    GLchar* infoLog = (GLchar *)malloc(infologLength);
    if (infoLog == NULL)
    {
        printf( "ERROR: Could not allocate InfoLog buffer");
        exit(1);
    }
    glGetShaderInfoLog(nVertexShader, infologLength, &charsWritten, infoLog);
    printf( "Shader InfoLog:\n%s", infoLog );
    free(infoLog);
}

您可以对链接执行相同的操作,只需检查链接 == 0 并按上述方式检索日志:

glLinkProgram(m_nProgram);
glGetProgramiv(m_nProgram, GL_LINK_STATUS, &linked);

【讨论】:

  • 谢谢,我想从长远来看,您的回答将比解决我的问题更有价值。
【解决方案3】:
precision highp float; 

这在 GLSL 1.20 中是不合法的。我什至不知道为什么将它放在 1.50 着色器中,因为精度限定符只在 GLSL ES 中做有用的事情,而你不能共享 1.50 着色器使用 GLSL ES。

【讨论】:

    猜你喜欢
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2016-08-08
    • 2011-06-22
    相关资源
    最近更新 更多