Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL ES 2.0 Android以单色渲染模型顶点?_Android_Opengl Es 2.0 - Fatal编程技术网

OpenGL ES 2.0 Android以单色渲染模型顶点?

OpenGL ES 2.0 Android以单色渲染模型顶点?,android,opengl-es-2.0,Android,Opengl Es 2.0,我显然是一个OpenGL装腔作势的人 我的目标是使用GLES20创建一个定制的Android GLSurfaceView控件,该控件可以加载STL资源文件(),并使用固定光源以单一定义的颜色进行渲染。 模型本身将旋转;照明和颜色将固定 听起来很简单,但我无法找到一种方法将我从大量简单的三角形/立方体示例中学到的知识应用到一个模型w/35k面(面数并不重要) 我借用了这段相当不错的代码[加载ascii STL文件]… …并将其更改为在Android Studio中运行并加载二进制STL文件:

我显然是一个OpenGL装腔作势的人

我的目标是使用GLES20创建一个定制的Android GLSurfaceView控件,该控件可以加载STL资源文件(),并使用固定光源以单一定义的颜色进行渲染。 模型本身将旋转;照明和颜色将固定

听起来很简单,但我无法找到一种方法将我从大量简单的三角形/立方体示例中学到的知识应用到一个模型w/35k面(面数并不重要)

我借用了这段相当不错的代码[加载ascii STL文件]…

…并将其更改为在Android Studio中运行并加载二进制STL文件:

渲染器的着色器代码仅使用面法线计算颜色,从而产生可爱的彩虹效果,并产生被照亮的错觉:

我认为这意味着这里没有真正的照明

我一定是遗漏了什么,因为我认为我想做的比从法线计算颜色还要简单;我只想使用从法线着色的单一定义颜色绘制对象。我试图通过将片段颜色设置为常量来实现这一点,但这会产生一个看起来非常2D的图像/轮廓,没有阴影。 我相当确定这需要增加照明,也许这会增加一点代码,但我显然是一个装腔作势的人,我甚至不能想出一个复杂的方法来做这件事

我在谷歌搜索了所有我想做的事情的例子;我想它会很容易找到,但我一直找不到。我只是在寻找一个简单的经典“茶壶”的例子,其中的颜色可以定义。 有人愿意告诉我如何简单地编写代码,或者我在哪里可以找到一个简单的例子来说明我正在尝试做什么

谢谢


Pv

当前,您将颜色设置为您拥有的非变换法向量。因此,您正在可视化每个片段的正常组件

要启用一些非常基本的照明,首先需要选择灯光的基础位置。我建议使用正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轴的平行光

如果您想为灯光设置自定义位置,请添加更多灯光或添加一些镜面反射照明,我建议您阅读以下示例。数学的数量增加了一点,但它保持相当简单


祝你好运

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

要启用一些非常基本的照明,首先需要选择灯光的基础位置。我建议使用正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轴的平行光

如果您想为灯光设置自定义位置,请添加更多灯光或添加一些镜面反射照明,我建议您阅读以下示例。数学的数量增加了一点,但它保持相当简单


祝你好运

谢谢@mikkokoo!我试试看。与此同时,我很幸运地使用了Rajawali3d库,并计划对最简单的原始OpenGLES2代码进行反向工程,以渲染一个发光的对象并在这里回答我的问题。我觉得奇怪的是,我不能轻易地找到一个像这样已经存在的简单例子。谢谢@mikkokoo!我试试看。与此同时,我很幸运地使用了Rajawali3d库,并计划对最简单的原始OpenGLES2代码进行反向工程,以渲染一个发光的对象并在这里回答我的问题。我觉得奇怪的是,我不能轻易地找到一个像这样已经存在的简单例子。