我正在尝试将一些旧的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
目标为纹理提供像素缓冲区对象。
答案 0 :(得分:0)
sampler2D
代替sampler2DRect
(如果您没有真正的需要),因为引用the wiki,"来自现代观点,它们(矩形纹理)似乎基本无用。"。然后,您可以将texture2DRect(...)
更改为texture(...)
或texelFetch(...)
(以模仿您的矩形提取)。
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);
}
答案 1 :(得分:0)
顶点着色器:
#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;
}
这似乎有效。