【问题标题】:OpenGL ES 2.0 Android render model vertices in single color?OpenGL ES 2.0 Android 以单色渲染模型顶点?
【发布时间】:2015-11-20 01:52:57
【问题描述】:

我显然是一个 OpenGL 装腔作势者。

我的目标是拥有一个使用 GLES20 的自定义 Android GLSurfaceView 控件,该控件可以加载 STL 资源文件 (https://en.wikipedia.org/wiki/STL_(file_format)) 并以固定照明的单一定义颜色呈现它。 模型本身会旋转;灯光和颜色将被固定。

听起来很简单,但我无法找到一种方法将我从大量简单的三角形/立方体示例中学到的知识应用到每个面上都有单独的颜色的模型中(不是说面的数量真的很重要) )。

我借用了这个相当不错的代码 [加载 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 的图像/轮廓没有阴影。 我相当肯定这需要添加照明,也许这会增加一点代码,但我显然对此很装腔作势,以至于我什至无法想出一个复杂的方法来做到这一点。

我已经在 Google 上搜索了我想做的事情的例子;我认为它会很容易找到,但我一直找不到。我只是在寻找一个可以定义颜色的简单经典“茶壶”示例。 有人愿意向我展示如何简单地编写代码,或者我在哪里可以找到我正在尝试做的简单示例?

谢谢!

Pv

【问题讨论】:

    标签: android opengl-es-2.0


    【解决方案1】:

    目前您将颜色设置为您拥有的未转换的法线向量。因此,您正在可视化每个片段具有的正常组件。

    要启用一些非常基本的光照,首先您需要选择您希望光照的位置。我会建议正 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。数学的数量增加了一点,但它仍然很简单。

    祝你好运!

    【讨论】:

    • 谢谢@mikkokoo!我会试试看。与此同时,我一直很幸运地使用了 Rajawali3d 库,并计划对最简单的原始 OpenGLES2 代码进行逆向工程,我可以用它来渲染一个点亮的对象并在这里回答我的问题。我觉得很奇怪,我不能轻易找到一个已经存在的像这样的简单示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2016-05-04
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多