三角形不可见OpenGLES2.0 android

用户名

大家好,我是OpenGL的初学者,我正在尝试遵循android开发人员教程。但是我看不到三角形。怎么了;

我尝试在创建的曲面上创建一个三角形,并在Renderer类的inseide onDraw中调用了draw方法。

三角类:

public class Triangle {
    private final String vertexShaderCode =
            "attribute vec4 vPosition;" +
            "void main() {" +
            "  gl_Position = vPosition;" +
            "}";
    private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX;
    private final int vertexStride = COORDS_PER_VERTEX * 4;
    private int mProgram,mPositionHandle,mColorHandle;
        private final String fragmentShaderCode =
            "precision mediump float;" +
            "uniform vec4 vColor;" +
            "void main() {" +
            "  gl_FragColor = vColor;" +
            "}";
    private FloatBuffer vertexBuffer;

    // number of coordinates per vertex in this array
    static final int COORDS_PER_VERTEX = 3;
    static float triangleCoords[] = {   // in counterclockwise order:
             0.0f,  0.622008459f, 0.0f, // top
            -0.5f, -0.311004243f, 0.0f, // bottom left
             0.5f, -0.311004243f, 0.0f  // bottom right
    };

    // Set color with red, green, blue and alpha (opacity) values
    float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f };

    public Triangle() {
        // initialize vertex byte buffer for shape coordinates
        ByteBuffer bb = ByteBuffer.allocateDirect(
                // (number of coordinate values * 4 bytes per float)
                triangleCoords.length * 4);
        // use the device hardware's native byte order
        bb.order(ByteOrder.nativeOrder());

        // create a floating point buffer from the ByteBuffer
        vertexBuffer = bb.asFloatBuffer();
        // add the coordinates to the FloatBuffer
        vertexBuffer.put(triangleCoords);
        // set the buffer to read the first coordinate
        vertexBuffer.position(0);
        int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
        int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

        mProgram = GLES20.glCreateProgram();             // create empty OpenGL ES Program
        GLES20.glAttachShader(mProgram, vertexShader);   // add the vertex shader to program
        GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
        GLES20.glLinkProgram(mProgram);   
    }

    public static int loadShader(int type, String shaderCode){

        // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
        // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
        int shader = GLES20.glCreateShader(type);

        // add the source code to the shader and compile it
        GLES20.glShaderSource(shader, shaderCode);
        GLES20.glCompileShader(shader);

        return shader;
    }

    public void draw() {
        // Add program to OpenGL ES environment
        GLES20.glUseProgram(mProgram);

        // get handle to vertex shader's vPosition member
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");

        // Enable a handle to the triangle vertices
        GLES20.glEnableVertexAttribArray(mPositionHandle);

        // Prepare the triangle coordinate data
        GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
                                     GLES20.GL_FLOAT, false,
                                     vertexStride, vertexBuffer);

        // get handle to fragment shader's vColor member
        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");

        // Set color for drawing the triangle
        GLES20.glUniform4fv(mColorHandle, 1, color, 0);

        // Draw the triangle
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);

        // Disable vertex array
        GLES20.glDisableVertexAttribArray(mPositionHandle);
    }
}
克莱蒙哥马利

您缺少用于设置投影矩阵和视口的代码。您还需要调用glSwapBuffers(),除非您使用的是GLSurfaceView,它会为您执行此操作。为了简单起见,可以使用正交投影,并且应该将其乘以顶点着色器中的每个vPosition。

这是您可以使用和构造投影矩阵的方式:

Ortho(-1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f);
glUniformMatrix4fv(iProjectionMatrixLocation, 1, GL_FALSE, (const GLfloat *)&m_mViewProj);
glViewport(0, 0, m_iWidth, m_iHeight);


...

// Construct a matrix for an orthographic projection view.
void Button::Ortho(float left, float top, float right, float bottom, float nearPlane, float farPlane)
{
    float rcplmr = 1.0f / (left - right);
    float rcpbmt = 1.0f / (bottom - top);
    float rcpnmf = 1.0f / (nearPlane - farPlane);

    m_mViewProj.f0 = -2.0f * rcplmr;
    m_mViewProj.f1 = 0.0f;
    m_mViewProj.f2 = 0.0f;
    m_mViewProj.f3 = 0.0f;
    m_mViewProj.f4 = 0.0f;
    m_mViewProj.f5 = -2.0f * rcpbmt;
    m_mViewProj.f6 = 0.0f;
    m_mViewProj.f7 = 0.0f;
    m_mViewProj.f8 = 0.0f;
    m_mViewProj.f9 = 0.0f;
    m_mViewProj.f10 = -2.0f * rcpnmf;
    m_mViewProj.f11 = 0.0f;
    m_mViewProj.f12 = (right + left) * rcplmr;
    m_mViewProj.f13 = (top + bottom) * rcpbmt;
    m_mViewProj.f14 = (nearPlane + farPlane) * rcpnmf;
    m_mViewProj.f15 = 1.0f;
}

这里的第三篇文章将对您有所帮助:

http://montgomery1.com/opengl/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

android: 如何制作三角形布局

来自分类Dev

如果用户指定(大于0),则打印三角形的行

来自分类Dev

在Android中制作一个三角形按钮

来自分类Dev

如何在Android画布上绘制实心三角形

来自分类Dev

三角形形状的按钮,用于Android活动

来自分类Dev

为Android应用程序创建一个三角形按钮

来自分类Dev

在Android中更改微调器上的小三角形的颜色

来自分类Dev

无法在Android上使用OpenGL ES 2.0绘制三角形

来自分类Dev

Android三角形自定义按钮

来自分类Dev

Android将三角形可绘制设置为按钮可绘制向左

来自分类Dev

如何在Android中使用Cardview附加此三角形?

来自分类Dev

如何在 0 和 1 的网格中识别等腰三角形?

来自分类Dev

Android:使用xml定义(可绘制)制作一个三角形的按钮

来自分类Dev

如何在Android中绘制复杂的形状,包含三角形,矩形和笔触

来自分类Dev

为背景创建具有矩形和三角形的 Android XML 形状,如图所示

来自分类Dev

如何在xml drawable android中绘制一个矩形内端三角形形状?

来自分类Dev

包含点的三角形数(0,0)

来自分类Dev

滚动时nvidia出现故障:可见的三角形

来自分类Dev

重叠三角形

来自分类Dev

for循环的三角形

来自分类Dev

渐变三角形

来自分类Dev

圆角三角形

来自分类Dev

拖放三角形

来自分类Dev

纹理三角形

来自分类Dev

将三角形拆分为较小的三角形

来自分类Dev

三角形CSS中的三角形

来自分类Dev

如何获得AABB三角形的三角形?

来自分类Dev

Meshlab 不可视化三角形的面,层格式错误?

来自分类Dev

寻找三角形的第三坐标