簡體   English   中英

如何將橢圓形轉換為圓形openGL ES2.0 Android

[英]How can i convert an oval to circle openGL ES2.0 Android

我一直在從事openGL ES 2.0 Android項目。 我的目標是創建一個圈子。 從網上獲得的幫助下,我設法運行了這段代碼,該代碼本來是要在視圖中畫一個圓的,但是我卻得到了一個橢圓形的代碼。 我嘗試了多種方法使其旋轉。 任何幫助應表示贊賞

謝謝

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import android.opengl.GLES20;
import android.util.Log;

public class Circle {

private int mProgram, mPositionHandle, mColorHandle, mMVPMatrixHandle;
private FloatBuffer mVertexBuffer;
private float vertices[] = new float[364 * 3];
float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f };

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

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

Circle() {
    vertices[0] = 0;
    vertices[1] = 0;
    vertices[2] = 0;

    for (int i = 1; i < 364; i++) {
        vertices[(i * 3) + 0] = (float) (0.5 * Math.cos((3.14 / 180)
                * (float) i) + vertices[0]);
        vertices[(i * 3) + 1] = (float) (0.5 * Math.sin((3.14 / 180)
                * (float) i) + vertices[1]);
        vertices[(i * 3) + 2] = 0;
    }

    Log.v("Thread", "" + vertices[0] + "," + vertices[1] + ","
            + vertices[2]);
    ByteBuffer vertexByteBuffer = ByteBuffer
            .allocateDirect(vertices.length * 4);
    vertexByteBuffer.order(ByteOrder.nativeOrder());
    mVertexBuffer = vertexByteBuffer.asFloatBuffer();
    mVertexBuffer.put(vertices);
    mVertexBuffer.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) {

    int shader = GLES20.glCreateShader(type);
    GLES20.glShaderSource(shader, shaderCode);
    GLES20.glCompileShader(shader);
    return shader;
}

public void draw(float[] mvpMatrix) {

    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, 3, GLES20.GL_FLOAT,
            false, 12, mVertexBuffer);

    // 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);

    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");

    // Apply the projection and view transformation
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);

    // Draw the triangle
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 364);

    // Disable vertex array
    GLES20.glDisableVertexAttribArray(mPositionHandle);

}

}

我得到的輸出是這個

在此處輸入圖片說明

頂點坐標的范圍是(歸一化)-1至+1-看來您正在生成的頂點范圍是-0.5至+0.5。

現在,GL引擎從哪里吸引? 窗口系統提供的緩沖區-在這種情況下為Android窗口系統。 Android窗口系統(即最低級別的linux內核顯示驅動程序)提供了一個widthxheight為480x640的緩沖區(您的屏幕截圖顯示width <height)。 因此,在屏幕上繪制的圓的寬度為0.5 * 480,但高度為0.5 * 640,因此為橢圓形。

您必須按(screenwidth / screenheight)的比例縮小y坐標,以得到一個真實的圓圈。 您可以在應用程序中使用egl API或Android API來獲取它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM