【问题标题】:OpenGL ES 2.0 colored rectangleOpenGL ES 2.0 彩色矩形
【发布时间】:2015-08-23 08:51:08
【问题描述】:

我想使用 OpenGL ES 2.0 为 Android 编写一个应用程序,该应用程序显示一个彩色矩形,如下所示:

这是我的 2 个着色器:

// Vertex Shader
attribute vec4 vPosition;
void main() {
  gl_Position = vPosition;
}

// Fragment Shader
uniform vec4 u_colorRGBA;
void main() {
    gl_FragColor = u_colorRGBA;
}

我可以绘制不同颜色的矩形,但我想绘制它们,所以每个角都有不同的颜色。我可以将变量从顶点着色器传递到片段着色器以定义每个角的颜色吗?如果是这样,我如何定义变量并将它们传递过来?或者有其他方法吗?

【问题讨论】:

  • 你必须为此使用属性(类似于 vPosition)

标签: java android opengl-es colors shader


【解决方案1】:

我想出了一个办法:

我这样改变了我的着色器:

// Vertex Shader
attribute vec4 inColor;
varying vec4 vColor;
attribute vec4 vPosition;
void main() {
  gl_Position = vPosition;
  vColor = inColor;
}

// Fragment Shader
varying vec4 vColor;
void main() {
    gl_FragColor = vColor;
}

然后我像这样画矩形:

public static void Draw(float vertices[], int verticesCount, float color[]) {
    vertexBuffer.put(vertices);
    vertexBuffer.position(0);

    GLES20.glEnableVertexAttribArray(sPosition);
    GLES20.glVertexAttribPointer(sPosition, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer);

    colorBuffer.put(color);
    colorBuffer.position(0);

    GLES20.glEnableVertexAttribArray(sColor);
    GLES20.glVertexAttribPointer(sColor, 4, GLES20.GL_FLOAT, false, 0, colorBuffer);

    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, verticesCount);  // Draw

    GLES20.glDisableVertexAttribArray(sPosition);
    GLES20.glDisableVertexAttribArray(sColor);
}

这是正确的做法吗?还是他们有更好的方法?

【讨论】:

  • 现在问这个太迟了,但如果可能的话,你能提供这个彩色矩形的完整渲染器代码吗?这对我有帮助。
【解决方案2】:

干得好,这只是通过两个着色器传递颜色变量的一种方法。

但是,更简单一点,您可以在不通过两个着色器的情况下完成此操作。

vec2 uv = gl_FragCoord.xy / resolution.xy; 
gl_FragColor = vec4(uv,0.0,1.0);

你仍然需要传递一个 uniform2f, resolution 直接进入片段着色器,或者你可以将它定义为一个常量,如 const vec2 resolution = vec2(320.,480.); 在片段着色器中

【讨论】:

  • 好的,谢谢你展示了另一种方式,但因为我的方式对我来说很好,所以我会保留它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多