2015-11-20 93 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