【问题标题】: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 显示的类,而不是一般的文本渲染)。

【问题讨论】:

    标签: android opengl-es-2.0 glsl


    【解决方案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 的回答的评论)以及如何摆脱它?否则,您知道关于该主题的好的教程或文档链接吗?
    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2013-09-17
    • 2011-10-04
    • 1970-01-01
    相关资源
    最近更新 更多