2017-12-27 7 views
1

줄이 있으며 배열의 색상으로 그립니다.OpenGL ES 3.0 자바가 색상 배열 (각 꼭지점마다 다른 색상)을 사용하여 정점을 그립니다.

색상 배열은 각 꼭지점에 대한 RGBA 데이터가있는 FloatBuffer입니다.

는 나는이 방법을 시도했지만 작동하지 않습니다 :

쉐이더 코드 :

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

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

그리기 방법 :

public void draw(GL10 gl) 
{ 
    GLES30.glUseProgram(mProgram); 

    mPositionHandle = GLES30.glGetAttribLocation(mProgram, "vPosition"); 

    GLES30.glEnableVertexAttribArray(mPositionHandle); 

    GLES30.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES30.GL_FLOAT, false, vertexStride, vertexBuffer); 

    gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 

    gl.glColorPointer(vertexBufferSize/4/4, GL10.GL_FLOAT, 4*4, colorBuffer); 

    GLES30.glDrawArrays(GLES30.GL_LINES, 0, vertexBufferSize/4/COORDS_PER_VERTEX); 

    GLES30.glDisableVertexAttribArray(mPositionHandle); 

    gl.glDisableClientState(GL10.GL_COLOR_ARRAY); 
} 

내가이 개 좌표를 사용하여이 설정하기 정점 (COORDS_PER_VERTEX = 2).

무엇이 문제입니까?

답변

1

glEnableClientStateglColorPointer은 OpenGL ES의 일부가 아닙니다. 그들은 Legacy OpenGL의 일부이며 더 이상 사용되지 않음 Fixed Function Pipeline입니다. 다른 색상을 정의하려면,

int color_loc = GLES30.glGetUniformLocation(mProgram, "vColor") 
GLES30.glUseProgram(mProgram); 
GLES30.glUniform4f(color_loc, 1.0, 0.0, 0.0, 1.0); // red 

mPositionHandle = GLES30.glGetAttribLocation(mProgram, "vPosition"); 
GLES30.glEnableVertexAttribArray(mPositionHandle); 
GLES30.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES30.GL_FLOAT, false, vertexStride, vertexBuffer); 

GLES30.glDrawArrays(GLES30.GL_LINES, 0, vertexBufferSize/4/COORDS_PER_VERTEX); 
GLES30.glDisableVertexAttribArray(mPositionHandle); 


그러나 : 당신은 색상 균일 변수를 사용하는 경우

후 전체 라인은 균일 한 변수로 설정되어있는 색으로 착색된다 속성을 사용하면 꼭짓점 좌표와 마찬가지로 색상 속성을 선언해야합니다. 그리고 당신은 조각 쉐이더 버텍스 쉐이더에서 속성을 통과해야 :

mPositionHandle = GLES30.glGetAttribLocation(mProgram, "aPosition"); 
mColorHandle = GLES30.glGetAttribLocation(mProgram, "aColor"); 

GLES30.glEnableVertexAttribArray(mPositionHandle); 
GLES30.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES30.GL_FLOAT, false, vertexStride, vertexBuffer); 

GLES30.glEnableVertexAttribArray(mColorHandle); 
GLES30.glVertexAttribPointer(mColorHandle, 4, GLES30.GL_FLOAT, false, 0, colorBuffer); 

GLES30.glDrawArrays(GLES30.GL_LINES, 0, vertexBufferSize/4/COORDS_PER_VERTEX); 
GLES30.glDisableVertexAttribArray(mPositionHandle); 
GLES30.glDisableVertexAttribArray(mColorHandle); 
:

private final String vertexShaderCode = 
    "uniform mat4 uMVPMatrix;" + 

    "attribute vec4 aPosition;" + 
    "attribute vec4 aColor;" + 

    "varying vec4 vColor;" + 

    "void main() {" + 
    " vColor  = aColor;" + 
    " gl_Position = aPosition;" + 
    "}"; 

private final String fragmentShaderCode = 
    "precision mediump float;" + 

    "varying vec4 vColor;" + 

    "void main() {" + 
    " gl_FragColor = vColor;" + 
    "}"; 

색상을 정의는 속성 좌표는 정점에이를 않는 속성

관련 문제