【问题标题】:OpenGL - Texture mapping in vertex or fragment shader?OpenGL - 顶点或片段着色器中的纹理映射?
【发布时间】:2013-05-15 10:57:04
【问题描述】:

是否在片段着色器或顶点着色器中映射了对象/三角形的纹理?

无论是在顶点着色器还是片段着色器上,如果您正在编程着色器,您必须自己编写代码,对吗?如果没有着色器,您只是在不知情的情况下分配 tex 坐标和 opengl 映射它,但是使用着色器您必须自己做,对吗?

【问题讨论】:

  • "但是使用着色器你必须自己做,对吧?" - 事实上,这就是为什么 "片段中是否有对象/三角形的纹理映射着色器还是顶点着色器?” - 只能用“这完全是你的决定”来回答

标签: opengl shader textures


【解决方案1】:

通常纹理发生在片段着色器中。这是三角形碎片获得颜色的地方。

通常在顶点着色器中计算纹理坐标(或者直接从顶点属性传递它们而无需特殊计算)。

我写通常是因为现在你可以在所有着色器中使用纹理:顶点、几何、镶嵌。

更多信息请参见here

【讨论】:

    【解决方案2】:

    这是一个片段着色器示例,它在 GLSL 上实现光照,支持纹理、点和定向光照(索引为 0)以及最终的雾!

    varying vec3 vertex;
    varying vec3 normal;
    varying vec3 eye;
    
    uniform sampler2D DiffuseMap;
    
    void computeLight(in int i, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
    {
        ambient += gl_LightSource[i].ambient * gl_FrontMaterial.ambient;
    
        vec3 light;
    
        if(gl_LightSource[i].position.w == 1.0)
            light = gl_LightSource[i].position.xyz - vertex;
    
        else
            light = gl_LightSource[i].position.xyz;
    
        vec3 lightDiri = normalize(light);
    
        float NdotL = max(0.0, dot(normal, lightDiri));
    
        if(NdotL > 0.0)
        {
            float att = 1.0;
    
            // Calcule l'attinuation dans le cas d'une lumier pointctuelle
            if(gl_LightSource[i].position.w == 1.0)
            {
                float distance = length(light);
    
                att = 1.0 / (gl_LightSource[i].constantAttenuation
                + gl_LightSource[i].linearAttenuation
                * distance
                + gl_LightSource[i].quadraticAttenuation
                * distance
                * distance);
            }
    
            float NdotHV = dot(normal, normalize(lightDiri + eye));
    
            diffuse  += gl_FrontMaterial.diffuse * gl_LightSource[i].diffuse * NdotL * att;
            specular += gl_FrontMaterial.specular * gl_LightSource[i].specular * pow(NdotHV, gl_FrontMaterial.shininess) * NdotL * att;
        }
    }
    
    void main()
    {
        vec4 ambient = vec4(0);
        vec4 diffuse = vec4(0);
        vec4 specular = vec4(0);
    
        vec4 finalColor = vec4(0);
    
        computeLight(0, ambient, diffuse, specular);
        finalColor = ambient + diffuse * shadow;
    
        finalColor *= gl_Color;
        // *** This is what you asking for !
        finalColor *= texture2D(DiffuseMap, gl_TexCoord[0].st);
        finalColor += specular;
    
        // Foged ?
        float z = gl_FragCoord.z / gl_FragCoord.w;
        float fogFactor = (gl_Fog.end - z) / (gl_Fog.end - gl_Fog.start);
        fogFactor = clamp(fogFactor, 0.0, 1.0);
    
        gl_FragColor = mix(gl_Fog.color, finalColor, fogFactor);
        gl_FragColor *= finalColor.aaaa;
    }
    

    还有顶点着色器

    varying vec3 vertex;
    varying vec3 normal;
    varying vec3 eye;
    
    void main()
    {
        vertex  = vec3(gl_ModelViewMatrix * gl_Vertex);
        normal  = normalize(gl_NormalMatrix * gl_Normal);
        eye     = -normalize(vertex);
    
        gl_FrontColor       = gl_Color;
        gl_TexCoord[0].xy   = gl_MultiTexCoord0.xy;
        gl_Position         = ftransform();
        gl_ClipVertex       = gl_ModelViewMatrix*gl_Vertex;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多