有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java GLSL着色器无法在mac上工作

我试图在mac上用java创建GLSL纹理着色器,但mac不支持120版以上的任何版本。如何移植此330着色器:

//this is my Vertex Shader
#version 330

layout (location = 0) in vec3 position;
layout (location = 1) in vec2 texCoord;

out vec2 texCoord0;

uniform mat4 transform;

void main()
{
    gl_Position=transform*vec4(position,1.0);
    texCoord0=texCoord;
}

这是我的片段着色器

#version 330

in vec2 texCoord0;

uniform sampler2D sampler;

out vec4 gl_FragColor;

void main()
{
    gl_FragColor=texture2D(sampler,texCoord0.xy);

}

如何将这些着色器转换为glsl 120而不丢失功能


共 (1) 个答案

  1. # 1 楼答案

    你只需要:

    _删除layout限定符(包括位置分配)。你必须使用

    void glBindAttribLocation(GLuint program,
                               GLuint index,
                               const GLchar *name);
    

    链接程序之前,针对顶点着色器的每个输入(位置0和1的索引设置为0和1,如果您不理解变量的名称

    _在顶点着色器中,将in替换为attribute,将out替换为varying

    _在片段着色器中,将in替换为varying并使用gl_FragColor,但不声明它

    在您的情况下,在链接程序之前,您会有以下内容:

    //program is your shader program of course...
    //Bind vertex shader attributes (ins) instead of using layout
    glBindAttribLocation(program, 0, "position");
    glBindAttribLocation(program, 1, "texCoord");
    
    //Then the program should be linked (or relinked, it doesn't matter)
    glLinkProgram(program);
    

    顶点着色器:

    #version 120
    
    attribute vec3 position;
    attribute vec2 texCoord;
    
    varying vec2 texCoord0;
    
    uniform mat4 transform;
    
    void main()
    {
        gl_Position = transform*vec4(position, 1.0);
        texCoord0 = texCoord;
    }
    

    和你的片段着色器:

    #version 120
    
    varying vec2 texCoord0;
    
    uniform sampler2D sampler;
    
    void main()
    {
        gl_FragColor = texture2D(sampler, texCoord0.xy);
    
    }