【发布时间】:2015-02-28 04:08:08
【问题描述】:
我有一个 N910f note 4,最后一个棒棒糖 5.0.1。好吧,片段着色器没有编译,但是如果我注释掉纹理采样行(texture2D 调用),着色器就会编译。我不知道编译器发生了什么,因为 Log.e(TAG, GLES20.glGetShaderInfoLog(shader)) 调用没有抛出任何信息。
这是我的片段 glsl 代码:
#define numLights 1
#pragma glsl
precision mediump float;
struct LightSourceParameters {
vec3 ambient;
vec3 lightColor;
vec4 position;
float spotExponent;
float spotCutoff; // (range: [0.0,90.0], 180.0)
vec3 spotDirection;
float constantAttenuation;
float linearAttenuation;
float quadraticAttenuation;
};
uniform LightSourceParameters LightSource[numLights];
struct MaterialParameters {
vec4 emission;
vec4 ambient;
vec4 diffuse;
vec4 specular;
float shininess;
bool hasDiffuseTexture;
bool hasSpecularTexture;
bool hasEmissionTexture;
bool hasAmbientTexture;
bool hasNormalTexture;
sampler2D diffuseTexture;
sampler2D specularTexture;
sampler2D emissionTexture;
sampler2D ambientTexture;
sampler2D normalTexture;
};
uniform MaterialParameters Material;
varying vec2 outTextCoord;
varying vec3 outNormal;
varying vec3 outViewVector;
varying vec3 outLightVector[numLights];
/* Declaramos cabecera de funcion, necesaria para que GLSL no diga que la funcion no existe, al definirse despues de main */
vec4 computeLight(in MaterialParameters material, in LightSourceParameters lightSource, in vec3 normal, in vec2 textCoord, in vec3 lightVector, in vec3 halfVector);
vec4 computeEmissionLight(in MaterialParameters material, in vec2 textCoord);
void main(){
// Normalize the incoming vectors
vec3 normal = normalize(outNormal);
vec3 viewVector = normalize(outViewVector);
// BACKFACE CULLING:
float NdotVV = dot(normal,viewVector);
if (NdotVV <= 0.0) discard;
// normalize lightvector, compute half vectors and lights
vec4 totalColorLighting = vec4(0.0);
for (int indexComputeLights = 0; indexComputeLights < numLights; indexComputeLights++){
LightSourceParameters light = LightSource[indexComputeLights];
vec3 currentLightVector = vec3(0.0);
vec3 currentHalfVector = vec3(0.0);
if (length(light.ambient) == 0.0 ){ /* no es ambiental, que no tienen vector ni half vector */
currentLightVector = outLightVector[indexComputeLights]; // normalizamos posteriormente, para poder obtener la distancia a la luz del m�dulo de este vector
currentHalfVector = normalize(outLightVector[indexComputeLights] + outViewVector);
}
else {
// nothing
}
/* Si la luz es ambiental, halfVector y lightVector son
* indefinidos para esa luz, pero da igual porque no son
* utilizados en el algoritmo que calcula las luces
*/
/*
totalColorLighting = totalColorLighting + computeLight(Material, light, normal, outTextCoord, currentLightVector, currentHalfVector);
totalColorLighting = clamp(totalColorLighting,vec4(0.0),vec4(1.0));
*/
}
totalColorLighting = totalColorLighting + computeEmissionLight(Material, outTextCoord);
totalColorLighting = clamp(totalColorLighting,vec4(0.0),vec4(1.0));
/* Devolvemos el color de fragmento calculado para almacenarlo en el framebuffer */
totalColorLighting = vec4(1.0,1.0,0.34, 0.68);
gl_FragColor = clamp(totalColorLighting,vec4(0.0),vec4(1.0));
// gl_FragColor = vec4(1.0)*vec4(outTextCoord,1.0,1.0);
}
vec4 computeEmissionLight(in MaterialParameters material, in vec2 textCoord){
vec4 totalEmissionColorLighting = vec4(0.0, 0.0, 0.0, 0.0);
if ((length(vec3(material.emission)) != 0.0) || (material.hasEmissionTexture)) {
/* El material tiene un termino emisivo, es decir, emite luz. Lo andimos al total de color calculado */
if (!material.hasEmissionTexture) {
totalEmissionColorLighting = material.emission;
}
else {
totalEmissionColorLighting.rgba = texture2D(material.emissionTexture, textCoord).rgba;
// texture2D(material.diffuseTexture, textCoord);
}
}
return totalEmissionColorLighting;
}
代码中还有一个方法被注释掉了,computeLight。
好吧,在 computeEmissionLight 中,如果我对此发表评论,一切都会好起来的:
totalEmissionColorLighting.rgba = texture2D(material.emissionTexture, textCoord).rgba; // tried also without rgba
除了我糟糕的编码方式之外,有人发现有什么问题吗?
【问题讨论】:
-
在 GLSL 中用不透明类型 (
sampler2D) 实例化struct无效(对于uniform以外的任何内容)。如果您直接使用Material制服,而不是传递MaterialParameters,您的函数可能会更好地工作。 -
@Andon M. Coleman 谢谢!它现在按照您的建议工作。请添加您的评论作为选择和投票的答案。
标签: android opengl-es glsl opengl-es-2.0 glsles