【问题标题】:Draw invisible triangle openGL ES 2.0 without using shader在不使用着色器的情况下绘制不可见三角形openGL ES 2.0
【发布时间】:2014-08-07 14:52:37
【问题描述】:

我想在 OpenGL ES 3.0 中绘制隐形三角形。我认为将 Alpha 通道设为零就可以了。 这是我传递三角形顶点的方式:

在我的构造函数中,我正在初始化我的三角形顶点:

final float[] triangle2VerticesData = {
            // X, Y, Z, 
            // R, G, B, A
            -0.5f, -0.25f, 0.0f, 
            1.0f, 1.0f, 0.0f, 0.0f,      // Alpha is zero

            0.5f, -0.25f, 0.0f, 
            0.0f, 1.0f, 1.0f, 0.0f,      // Alpha is zero

            0.0f, 0.559016994f, 0.0f, 
            1.0f, 0.0f, 1.0f, 0.0f};     // Alpha is zero

额外信息:

在 onSurfaceCreated 中:

GLES20.glClearColor(0.5f, 0.5f, 0.5f, 0.5f);
// ... Creating and attaching shaders, creating veiw matrix using Lookat

在 onDrawFrame 中:

GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
// ... performaing simple rotation and passing MVP to shaders

在着色器中:

最终字符串 vertexShader = "统一 mat4 u_MVPMatrix;\n"

      + "attribute vec4 a_Position;     \n"     
      + "attribute vec4 a_Color;        \n"                   

      + "varying vec4 v_Color;          \n"     

      + "void main()                    \n"     
      + "{                              \n"
      + "   v_Color = a_Color;          \n"      

      + "   gl_Position = u_MVPMatrix   \n"     
      + "               * a_Position;   \n"                                                                          
      + "}                              \n";        
    final String fragmentShader =
        "precision mediump float;       \n"     

      + "varying vec4 v_Color;          \n"               
      + "void main()                    \n"     
      + "{                              \n"
      + "   gl_FragColor = v_Color;     \n"               
      + "}    

我可以通过播放 R G B 值来改变三角形的颜色。 但是当 A(Alpha) 设置为 1.0f 或 0.0f 时不会对透明度/不可见性产生任何变化吗? 谁能告诉我哪里出错了?

【问题讨论】:

    标签: android opengl-es opengl-es-2.0


    【解决方案1】:

    如果您希望三角形完全不可见,请不要渲染它。这是提高性能的最佳方法,加上一点额外的逻辑,应该很容易实现。

    如果您想要一些透明度,即不是完全不可见,请确保启用混合。 (关于如何进行混合的大量在线信息。在帖子中解释太多了。)

    GLES20.glEnable(GLES20.GL_BLEND);
    

    渲染透明对象后,

    GLES20.glDisable(GLES20.GL_BLEND);
    

    【讨论】:

    • 1) 我想对这个不可见的三角形执行一些遮挡查询。这就是为什么我需要画隐形。 2)但我的疑问仍然存在,通过更改 Alpha 为什么我的输出绘图没有任何变化?
    • 嗯,为了使 alpha 通道生效,需要启用混合。
    • GLES20.glEnable(GLES20.GL_BLEND); GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE); blend func 可以根据您的特定需求进行更改,但由于它完全不可见,因此最终结果将是相同的。
    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多