[英]OpenGL fragment shader is moving objects
我正在嘗試以類似於Vuforia帖子中建議的方式將定向照明寫入OpenGL着色器:
https://developer.vuforia.com/resources/dev-guide/enabling-lighting-effects
但是,此着色器的效果相當暗淡,並且已鎖定到設備,就像光源來自屏幕一樣。 因此,相反,我創建了一個uniform vec3f
,由模型視圖投影矩陣對其進行操作,以使我可以將常數矢量鎖定到模型框架(順便說一句,這似乎起作用了)。 為了抵消這種模糊性,我增加了環境光和漫射光顏色矢量的值,並且還向定向光添加了淡黃色,向環境光添加了淡藍色。
這導致一些東西消失了; 我猜想着色器可能正在創建無效的顏色值。 沒問題。 我在末尾添加了一個夾緊系統,將值從0.9到1.1壓縮到0.9到1.0的范圍內(一種原始的軟剪輯),並接受任何低於0.0的值並將它們夾緊到0.0。
上限鉗位適用於某些對象,但不適用於其他對象。 下限夾緊導致各種對象看起來以明顯隨機的角度旋轉。
所以我認為正在發生的事情是我的着色器溢出到相鄰的內存位置並破壞了頂點渲染,但是我不知道發生了什么。 而且,由於直到固定中間顏色矢量后才寫gl_FragColor,所以我不知道為什么會發生這種情況。 有人可以提出建議嗎?
完整的着色器代碼:
static const char* cubeMeshVertexShader = " \
\
attribute vec4 vertexPosition; \
attribute vec4 vertexNormal; \
attribute vec2 vertexTexCoord; \
\
varying vec2 texCoord; \
varying vec4 normal; \
\
uniform mat4 modelViewMatrix; \
uniform mat4 modelViewProjectionMatrix; \
void main() \
{ \
gl_Position = modelViewProjectionMatrix * vertexPosition; \
normal = modelViewMatrix * vec4(vertexNormal.xyz, 0.0); \
normal = normalize(normal); \
texCoord = vertexTexCoord; \
} \
";
static const char* cubeFragmentShader = " \
\
precision mediump float; \
\
varying vec2 texCoord; \
varying vec4 normal; \
\
uniform sampler2D texSampler2D; \
uniform vec3 lightingVector; \
uniform vec3 diffuseMaterial; \
\
void main() \
{ \
vec3 n = normalize(normal.xyz); \
vec3 lightDir = vec3(0.0, 0.0, -1.0); \
vec3 ambient = vec3(0.5, 0.57, 0.6); \
vec3 diffuseLight = vec3(0.9, 0.89, 0.87); \
float diffuseFactor = max(0.0, dot(n, normalize(lightingVector))); \
vec3 diffuse = diffuseFactor * diffuseMaterial * diffuseLight; \
vec3 shadedColor = ambient + diffuse; \
\
vec4 intermediate = vec4(shadedColor, 1.0) * texture2D(texSampler2D, texCoord); \
if(intermediate.x>0.9) { \
if(intermediate.x<1.1) { \
intermediate.x = intermediate.x / 2.0 + 0.45; \
} else { \
intermediate.x = 1.0; \
} \
} else if(intermediate.x<0.0) { \
intermediate.x = 0.0; \
} \
if(intermediate.y>0.9) { \
if(intermediate.y<1.1) { \
intermediate.y = intermediate.y / 2.0 + 0.45; \
} else { \
intermediate.y = 1.0; \
} \
} else if(intermediate.y<0.0) { \
intermediate.y = 0.0; \
} \
if(intermediate.z>0.9) { \
if(intermediate.z<1.1) { \
intermediate.z = intermediate.z / 2.0 + 0.45; \
} else { \
intermediate.z = 1.0; \
} \
} else if(intermediate.y<0.0) { \
intermediate.y = 0.0; \
} \
gl_FragColor = intermediate; \
} \
";
編輯:OpenGL標准指出gl_FragColor被自動鉗位到[0,1],所以我的鉗位系統是不必要的(盡管我可能會保留軟剪輯)。 但是,這表明導致問題的實際上是着色器操作的副作用,而不是影響。
着色器中的光照目錄是恆定的,但光照目錄應該是指向光源的對象中的光照目錄,因此應在頂點着色器中為每個頂點計算
vec3 LightDir = normalize(gl_LightSource[0].position.xyz - vec3(gl_ModelViewMatrix * gl_Vertex);
此外,您在中間計算中的系數之一(鉗位具有適當的功能:鉗位)coulb等於0。
這可能是:
這實際上是由於我愚蠢地未能在另一個編輯中將某些參數初始化為零而導致的。 它試圖用NaN
旋轉一些對象。 我將問題留在這里,因為這些評論對着色器編程有一些好的建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.