一个支持纹理渲染和逐顶点颜色的着色器,还是两个专用着色器?

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 的回答的评论)以及如何摆脱它?否则,您知道关于该主题的好的教程或文档链接吗?

以上是关于一个支持纹理渲染和逐顶点颜色的着色器,还是两个专用着色器?的主要内容,如果未能解决你的问题,请参考以下文章

GPU渲染管线概述

WebGL纹理颜色原理

WebGL 纹理颜色原理

图形渲染-渲染流水线

图形渲染-渲染流水线

哪些 OpenGL 函数在顶点着色器之前修改顶点位置?