2013-05-15 144 views
3

在片段着色器或頂點着色器中映射的對象/三角形是否存在紋理?OpenGL - 頂點或片段着色器中的紋理映射?

無論是在頂點還是片段着色器上,如果您正在編程着色器,那麼您必須自己編寫代碼才行嗎?如果沒有着色器,你只需將tex coords和opengl mapps分配給它就可以了,但是對於着色器,你必須自己做,對吧?

+1

*」但是有着色器你必須自己做,對嗎?「 - 的確,這就是爲什麼*」是否存在貼圖着色器或頂點着色器中映射的對象/三角形的紋理?「 - 只能是*回答「完全是你的決定」*。 –

回答

5

通常紋理髮生在片段着色器。這是三角形碎片獲得顏色的地方。

通常在頂點着色器中計算紋理座標(或者直接從頂點attrib傳遞它們而無需特殊計算)。

我寫了通常是,因爲現在你可以在所有着色器中使用紋理:頂點,幾何,tesselation。

有關詳細信息,請參見here。 「#

0

這是一個片段着色器的例子,它在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; 
}