2015-11-20 106 views
1

我顯然是一個OpenGL poseur。OpenGL ES 2.0 Android渲染單色模型頂點?

我的目標是使用GLES20自定義Android GLSurfaceView控件,該控件可以加載STL資源文件(https://en.wikipedia.org/wiki/STL_(file_format))並將其渲染爲具有固定光照的單一定義顏色。 模型本身將旋轉;照明和顏色將被固定。

聽起來很簡單,但我無法找到一種方法來將我從大量簡單的三角形/立方體示例中學到的東西應用於每張臉上的單獨顏色,並將其應用於具有35k張臉的模型(而不是真正的臉數事項)。

我借來[加載ASCII STL文件]這個相當不錯的代碼...
https://bitbucket.org/saschawillems/opengl-es/src/ed3b324dda4b/stlviewer/?at=master
......並把它改爲Android Studio中運行,並裝載二進制STL文件:
https://bitbucket.org/swooby/opengl-es/src/8bf43e1583c2/stlviewer/?at=binary

渲染的shader代碼只計算使用面法線一種顏色,這將導致一個可愛的彩虹效果有被點燃的錯覺:
https://bitbucket.org/swooby/opengl-es/src/8bf43e1583c238f4397bc469b13cd60dcb34674b/stlviewer/app/src/main/java/de/saschawillems/stlviewer/GLES20Renderer.java?at=binary&fileviewer=file-view-default#GLES20Renderer.java-166
我把它的意思,雖然沒有真正的實際的照明會在這裏。

我必須在這裏丟失一些東西,因爲我認爲我想要做的比從法線計算顏色更簡單;我只是想使用從法線陰影的單個定義顏色繪製對象。我試圖通過將片段顏色設置爲常量來做到這一點,但是這導致非常2D的圖像/輪廓(沒有陰影)。 我相當肯定這需要添加光照,也許這增加了一小部分代碼,但我明顯是這樣的poseur,我甚至不能確定它是一個複雜的方式來做到這一點。

我已經搜遍了所有Google的例子,我想做什麼;我認爲這會很容易找到,但我一直無法找到一個。我只是尋找一個簡單的經典「茶壺」例子,其中的顏色可以定義。 任何人都願意向我展示如何簡單地編寫代碼,或者我可以在哪裏找到我想要做的一個簡單示例?

謝謝!

Pv

回答

0

當前,您將顏色設置爲您所擁有的非變換法線向量。因此,您正在可視化每個片段所具有的正常組件。

要啓用一些非常基本的照明,首先您需要選擇您希望燈光的基礎。我會建議正Z軸。

然後通過着色器中的統一或常量定義顏色。現在

vec3 color = vec3(1.0,0.0,0.5); 

,既然你選擇了Z軸,您可以通過將它們與正常的Z分量乘以修改顏色分量:

vColor = vec4(color * aNormal[2], 1.0); 

大部分的對象將是黑色的,因爲正常的部件從去-1.0到1.0,顏色只從0.0到1。0,要克服這一點,你可以欺騙一下:

vColor = vec4(color * ((1.0 + aNormal[2])/2.0), 1.0); 

現在你看到的光線會被粘到模型的Z軸,而不是到世界各地。這是因爲你旋轉模型,但不是正常的。解決這個問題的最簡單的方法是在使用顏色分量之前,將旋轉矩陣應用於法線(您也需要將其作爲統一傳遞)。

uniform mat4 uRotMatrix; 
... 
vec4 rotatedNormal=uRotMatrix * vec4(aNormal,1.0); 
vColor = vec4(color * ((1.0 + rotatedNormal[2])/2.0), 1.0); 

這給你一個來自正Z軸的方向光。

如果您想爲燈具定製位置,請添加更多燈光或添加一些鏡面燈光,我建議您閱讀例如tutorial。數學的數量增加了一點,但它保持非常簡單。

祝你好運!

+0

謝謝@mikkokoo!我會試一試。在此期間,我一直在使用Rajawali3d庫獲得好運,並計劃對最簡單的原始OpenGLES2代碼進行反向工程,以便渲染點亮的對象並在此處回答我的問題。我覺得很奇怪,我無法輕鬆找到這樣一個簡單的例子。 – swooby