将ARB程序集转换为GLSL?

时间:2017-03-10 17:33:51

标签: opengl glsl

我正在尝试将一些旧的OpenGL代码翻译成现代的OpenGL。此代码从纹理中读取数据并显示它。片段着色器当前使用ARB_fragment_program命令创建:

static const char *gl_shader_code =
"!!ARBfp1.0\n"
"TEX result.color, fragment.texcoord, texture[0], RECT; \n"
"END";

GLuint program_id;
glGenProgramsARB(1, &program_id);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, program_id);
glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, (GLsizei) strlen(gl_shader_code ), (GLubyte *) gl_shader_code );

我只想把它翻译成GLSL代码。我认为片段着色器看起来应该是这样的:

    #version 430 core
    uniform sampler2DRect s;

    void main(void) 
    {
        gl_FragColor = texture2DRect(s, ivec2(gl_FragCoord.xy), 0);
    }

但我不确定一些细节:

  1. 这是texture2DRect的正确用法吗?
  2. 这是gl_FragCoord的正确用法吗?
  3. 使用GL_PIXEL_UNPACK_BUFFER目标为纹理提供像素缓冲区对象。

2 个答案:

答案 0 :(得分:0)

  1. 我认为您可以使用标准sampler2D代替sampler2DRect(如果您没有真正的需要),因为引用the wiki,"来自现代观点,它们(矩形纹理)似乎基本无用。"。
  2. 然后,您可以将texture2DRect(...)更改为texture(...)texelFetch(...)(以模仿您的矩形提取)。

    1. 由于您似乎在使用OpenGL 4,因此您不需要(不应该?)使用gl_FragColor,而是声明out变量并写入它。
    2. 您的片段着色器最终应该看起来像这样:

      #version 430 core
      uniform sampler2D s;
      out vec4 out_color;
      
      void main(void) 
      {
          out_color = texelFecth(s, vec2i(gl_FragCoord.xy), 0);
      }
      

答案 1 :(得分:0)

<@> @Zouch,非常感谢您的回复。我接受了它并对此进行了一些研究。我的最终核心与你的建议非常相似。为了记录,我实现的最终顶点和片段着色器如下:

顶点着色器:

#version 330 core

layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec2 vertexUV;

out vec2 UV;

uniform mat4 MVP;

void main()
{
    gl_Position = MVP * vec4(vertexPosition_modelspace, 1);
    UV = vertexUV;
}

Fragment Shader:

#version 330 core

in vec2 UV;

out vec3 color; 

uniform sampler2D myTextureSampler;

void main()
{
    color = texture2D(myTextureSampler, UV).rgb; 
}

这似乎有效。