我正在尝试将一些旧的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);
    }


但是我不确定几个细节:


这是texture2DRect的正确用法吗?
这是gl_FragCoord的正确用法吗?


使用GL_PIXEL_UNPACK_BUFFER目标向纹理提供像素缓冲区对象。

最佳答案

我认为您可以只使用标准的sampler2D而不是sampler2DRect(如果您没有真正的需要),因为引用the wiki,“从现代的角度看,它们(矩形纹理)似乎基本上没有用。 ”。


然后,您可以将texture2DRect(...)更改为texture(...)texelFetch(...)(以模仿矩形提取)。


由于您似乎正在使用OpenGL 4,因此无需(不应?)使用gl_FragColor,而是声明一个out变量并将其写入。


最后,片段着色器应如下所示:

#version 430 core
uniform sampler2D s;
out vec4 out_color;

void main(void)
{
    out_color = texelFecth(s, vec2i(gl_FragCoord.xy), 0);
}

关于opengl - 将ARB汇编翻译成GLSL吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42724440/

10-11 16:52
查看更多