2016-05-13 106 views
1

AMD OpenGL ES SDK for 3.1(如2016年5月13日的)片段着色器是這樣的:麻煩與AMD的OpenGL ES SDK 3.1片段着色器

precision highp float; 
uniform vec4 lightVec; 
uniform sampler2D textureUnit0; 
varying vec2 vTexCoord; 
varying vec3 vNormal; 
void main() 
{ 
    vec4 diff = vec4(dot(lightVec.xyz,normalize(vNormal)).xxx, 1); 
    gl_FragColor = diff * texture(textureUnit0, vTexCoord); 
} 

哪個是平坦的出錯。最近我得到糾正它是:

precision highp float; 
uniform vec4 lightVec; 
uniform sampler2D textureUnit0; 
varying vec2 vTexCoord; 
varying vec3 vNormal; 
void main() 
{ 
    vec4 diff = vec4(dot(lightVec.xyz,normalize(vNormal)).xxx, 1); 
    gl_FragColor = diff * texture2D(textureUnit0, vTexCoord); 
} 

這只是在最後一行將紋理變成texture2D。

不知道如何嘗試計算漫反射着色器。它使用獲得一個浮點數,然後在浮點數上調用一個swizzle(我認爲這就是你所說的.xxx運算符)來嘗試並複製它?

人們如何更輕鬆地瞭解着色器?這似乎是一個非常難以熟練的領域。

+0

原始着色器的代碼是不是「平出錯誤的」。它只是缺少版本指令。既然你正在嘗試使用ES 3.1,它應該有一個'#version 310 es'作爲第一行。沒有版本指令,缺省值爲版本100,對應於ES 2.0,它需要舊式紋理採樣功能。 –

回答

0

你說這行:

vec4 diff = vec4(dot(lightVec.xyz,normalize(vNormal)).xxx, 1); 

不因爲點的結果,調酒的編譯?嘗試:

float fDot = dot(lightVec.xyz,normalize(vNormal)); 
vec4 diff = vec4(fDot, fDot, fDot, 1); 

至於學習,以便更好地編寫着色器,我會尋找彌補教​​程上GLSL的任何味道,看看是否能找到一個你喜歡的,桌面版本不同,但並不不同,如果不將搜索範圍限制在一個特定的修訂版本中,您將能夠找到更好的教程。

然後用GLSLES 3.1規範武裝自己,這樣你就可以引用任何你不懂或不能翻譯成你選擇的方言的東西。並且獲得PowerVR着色器工具或類似的東西,讓您輸入着色器代碼,並獲得關於它是否編譯以及需要多少次循環的即時反饋。

0

使用texture()函數對ES 3.1着色器進行紋理採樣實際上是正確的。在與ES 2.0一起使用的GLSL版本中使用texture2D()函數,但不適用於當前版本。

你必須改變它的原因是你的着色器代碼缺少版本指令。它應該有這個作爲第一行,如果你確實想在着色器代碼中使用ES 3.1的功能:

#version 310 es 

着色器是無效的,但是。着色器代碼中的.xxx的官方名稱是組件選擇運算符。它僅適用於載體,這顯然是在GLSL ES 3.10規範規定了:

注意,標量不被認爲是單組分的載體,因此標量使用組件選擇運營商是違法的。

dot()函數返回一個float值,它是一個標量值。因此,這種結構是無效的:

dot(...).xxx 

正確地重寫該行的最優雅(恕我直言)的方法是:

vec4 diff = vec4(vec3(dot(lightVec.xyz, normalize(vNormal))), 1.0);