我显然是一个OpenGL姿势。
我的目标是使用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
渲染器的着色器代码只是使用面法线计算颜色,这会产生可爱的彩虹效果,并带有被点亮的幻觉:
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的图像/轮廓,没有阴影。 我相当肯定这需要添加照明,也许这会增加一些代码,但我显然是这样的一个姿势,我甚至无法想象它是一种复杂的方法。
我搜遍了谷歌,看看我想做什么的例子;我认为这会很容易找到,但我一直找不到。我只是在寻找一个简单的经典" Teapot"可以定义颜色的示例。 有人愿意告诉我如何简单地编写代码,或者在哪里可以找到我想要做的简单示例?
谢谢!
Pv的
答案 0 :(得分: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。数学量增加了一点,但它保持非常简单。
祝你好运!