一个支持纹理渲染和逐顶点颜色的着色器,还是两个专用着色器?
Posted
技术标签:
【中文标题】一个支持纹理渲染和逐顶点颜色的着色器,还是两个专用着色器?【英文标题】:One shader enabling texture rendering and per-vertex color, or two dedicated shaders? 【发布时间】:2014-03-23 16:32:03 【问题描述】:我正在使用 OpenGL 编写一个简单的 android 程序来显示简单的每个顶点的彩色形状和一个显示帧速率的计数器。
我发现由于 OpenGL 中缺乏内置的文本渲染,显示帧速率很棘手......我搜索了很长时间以找到一个可以使用 OpenGL ES 2.0 执行此操作的简单代码,我发现 @ 987654321@ 在 Github 上。为此,它使用了专用的顶点和片段着色器。下面展示了片段着色器:
uniform sampler2D u_Texture;
precision mediump float;
uniform vec4 u_Color;
varying vec2 v_TexCoordinate;
void main()
gl_FragColor = texture2D(u_Texture, v_TexCoordinate).w * u_Color;
但是,为了渲染每个顶点的彩色形状,我使用了以下片段着色器:
precision mediump float;
varying vec4 v_Color;
void main()
gl_FragColor = v_Color;
我对此有点困惑......
我的 Android 应用程序可以同时使用两种着色器并在其中一种之间切换吗?如果是,如何?
或者我应该使用一个着色器来完成这两项任务吗?在这种情况下,着色器会是什么样子?
另外,我希望能提供任何关于如何在 OpenGL ES 2.0 中轻松实现 FPS 显示的提示(我的意思是一些专门用于 FPS 显示的类,而不是一般的文本渲染)。
【问题讨论】:
【参考方案1】:我不确定我们如何在 android 中做到这一点,但在 OpenGL 中,可以为不同的几何图形使用不同的着色器。它是这样的。
glUseProgram(textShaderProgram)
/* draw text /*
glUseProgram(otherStuffProgram)
/* draw other stuff */
所以基本的想法是在绘制应该应用着色器的几何体之前激活着色器。希望你能找到类似的安卓系统。
【讨论】:
很高兴知道这是一种可能性。但是,当我在绘图函数中执行GLES20.glUseProgram(programDefault.getHandle());
时,我收到以下消息:“validate_vertex_attrib_state:53:在绘图调用中未启用顶点属性!”。这不是错误,只是一个信息,但它似乎是由glUseProgram
引起的...【参考方案2】:
一般来说,在 OpenGL (ES) 中使用任何“通用”着色器都是一种不好的做法。他们的效率太低了。他们有太多的指示。它们在 GPU 上的优化并不好。您应该根据需要为特定需求创建尽可能多的着色器。
【讨论】:
感谢您的建议。你知道为什么我得到“在绘图调用中没有启用顶点属性!”在我的绘图功能中使用GLES20.glUseProgram
时的消息(请参阅我对 Abhishek 的回答的评论)以及如何摆脱它?否则,您知道关于该主题的好的教程或文档链接吗?以上是关于一个支持纹理渲染和逐顶点颜色的着色器,还是两个专用着色器?的主要内容,如果未能解决你的问题,请参考以下文章