java - OpenGL es 2.0 颜色

标签 java android opengl-es

我在openGL es 2.0中画了一个立方体。 现在它只有两个面,用于测试目的(正面和背面)。所以基本上太空中有两个平面,两者都有相同的颜色。

现在我想为每张脸应用不同的颜色。我认为扩展颜色数组就足够了,但颜色没有改变(只有原始颜色)。 我必须更改着色器吗?或者将特定的函数传递给绘制方法? 类(class)应该更好地解释

public class Cube {

private FloatBuffer mVer;
private FloatBuffer colMem;
private ShortBuffer ordVer;

private float vertici[] = {
        -0.2f, 0.2f, 0.2f, //p1 upper left front plane (0)
        -0.2f, -0.2f, 0.2f,  //p2 lower left front plane (1)
        0.2f,  -0.2f, 0.2f,  //p3 lower right front plane (2)
        0.2f, 0.2f, 0.2f,  //p4 upper right front plane (3)

        -0.2f, 0.2f, -0.2f, //p1 upper left front plane (4)
        -0.2f, -0.2f, -0.2f,  //p2 lower left front plane (5)
        0.2f,  -0.2f, -0.2f,  //p3 lower right front plane (6)
        0.2f, 0.2f, -0.2f,  //p4 upper right front plane (7)



        };

private short order[] = {
        0, 1, 2, 0, 2, 3, //front face
        7, 6, 5, 7, 5, 4, //back face
        //3, 2, 6, 3, 6, 7, //right face 
       // 0, 1, 5, 0, 5, 4 //left face 
        };

private float color [] = { 
        0.8f, 0.8f, 0.1f, 1.0f,//color1
        0.8f, 0.8f, 0.1f, 1.0f,
        0.8f, 0.8f, 0.1f, 1.0f,
        0.8f, 0.8f, 0.1f, 1.0f,

        0.1f, 0.2f, 0.5f, 1.0f,//color2
        0.1f, 0.2f, 0.5f, 1.0f,
        0.1f, 0.2f, 0.5f, 1.0f,
        0.1f, 0.2f, 0.5f, 1.0f
        };

private final String vertCode = 
        "uniform mat4 uMVPMatrix;"+
        "attribute vec4 vPosition;"+
        "void main() {"+
        "gl_Position = uMVPMatrix * vPosition;"+
        "}";

private final String fragCode = 
        "precision mediump float;"+
        "uniform vec4 vColor;"+
        "void main() {"+
        "gl_FragColor = vColor;"+
        "}";

private int prog;

private int pos;
private int col;
private int mHandle;



public Cube () {

    mVer = ByteBuffer.allocateDirect(vertici.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();

    mVer.put(vertici).position(0);

    ordVer = ByteBuffer.allocateDirect(order.length * 2).order(ByteOrder.nativeOrder()).asShortBuffer();

    ordVer.put(order).position(0);

    colMem = ByteBuffer.allocateDirect(color.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();

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

    int vertexShader = Render.loadShader (GLES20.GL_VERTEX_SHADER, vertCode);
    int fragmentShader = Render.loadShader (GLES20.GL_FRAGMENT_SHADER, fragCode);

    prog = GLES20.glCreateProgram();
    GLES20.glAttachShader(prog, vertexShader);
    GLES20.glAttachShader(prog, fragmentShader);
    GLES20.glLinkProgram(prog);


}

public void draw (float[] mVMatrix) {


    GLES20.glUseProgram(prog);

    pos = GLES20.glGetAttribLocation(prog, "vPosition");

    GLES20.glEnableVertexAttribArray(pos);

    GLES20.glVertexAttribPointer(pos, 3, GLES20.GL_FLOAT, false, 12, mVer);

    col = GLES20.glGetUniformLocation(prog, "vColor");

    GLES20.glUniform4fv(col, 1, color, 0);

    mHandle = GLES20.glGetUniformLocation(prog, "uMVPMatrix");

    GLES20.glUniformMatrix4fv(mHandle, 1, false, mVMatrix, 0);

    GLES20.glEnable(GLES20.GL_CULL_FACE);
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, order.length, GLES20.GL_UNSIGNED_SHORT, ordVer);

    GLES20.glDisableVertexAttribArray(pos);

}

}

最佳答案

您有几个选择:

  • 如果您想将颜色作为制服传递(这似乎是您要去的地方),您需要使用单独的绘制调用来绘制每个面。您不能只传递制服的颜色数组,并期望颜色按顺序应用于三角形。您可以使用第一种颜色调用 glUniform4v,仅使用第一个面的索引调用 glDrawElements,然后对每个面重复这两个调用。这是相当低效的。
  • 您将颜色设置为属性而不是统一颜色,这与您对顶点位置所做的操作非常相似。使用此方法时必须小心,因为每个位置和颜色组合都需要一个 OpenGL 顶点。对于立方体,通常最终有 24 个顶点。如果您搜索有关类似主题的旧问题,您应该能够找到详细信息。

可以应用另一种称为“实例渲染”的方法,但该方法仅在 ES 3.0 中可用。

关于java - OpenGL es 2.0 颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23493573/

相关文章:

android - 如何在 Android 上创建两行 TextView?

ios - 我如何根据深度在 OpenGL ES 2.0 中为事物着色?

ios - 图形的 OpenGL 像素操作

java - 适合初学者的 SAML 简单示例

java - 从断言中获取日志消息

android - 如何防止系统字体大小改变对 Android 应用程序特定部分的影响?

Android - 在表格行内以编程方式设置按钮宽度

java - 以一种不麻烦的方式绘制点?

java - 适用于 Android 的 Feed 阅读器

objective-c - 为什么 OpenGL ES 无法正确渲染?