在片段着色器或頂點着色器中映射的對象/三角形是否存在紋理?OpenGL - 頂點或片段着色器中的紋理映射?
無論是在頂點還是片段着色器上,如果您正在編程着色器,那麼您必須自己編寫代碼才行嗎?如果沒有着色器,你只需將tex coords和opengl mapps分配給它就可以了,但是對於着色器,你必須自己做,對吧?
在片段着色器或頂點着色器中映射的對象/三角形是否存在紋理?OpenGL - 頂點或片段着色器中的紋理映射?
無論是在頂點還是片段着色器上,如果您正在編程着色器,那麼您必須自己編寫代碼才行嗎?如果沒有着色器,你只需將tex coords和opengl mapps分配給它就可以了,但是對於着色器,你必須自己做,對吧?
通常紋理髮生在片段着色器。這是三角形碎片獲得顏色的地方。
通常在頂點着色器中計算紋理座標(或者直接從頂點attrib傳遞它們而無需特殊計算)。
我寫了通常是,因爲現在你可以在所有着色器中使用紋理:頂點,幾何,tesselation。
有關詳細信息,請參見here。 「#
這是一個片段着色器的例子,它在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;
}
*」但是有着色器你必須自己做,對嗎?「 - 的確,這就是爲什麼*」是否存在貼圖着色器或頂點着色器中映射的對象/三角形的紋理?「 - 只能是*回答「完全是你的決定」*。 –