저는 이렇게 몇 가지 질문을 보았습니다.하지만 지금까지 도움이 된 것은 없습니다. 나는 GLTriangle과 GLRectangle 클래스를 만들었다. 이 두 가지 모양을 아무 문제없이 색칠 할 수 있습니다. 나는 그것들에 텍스처를 구현하려고하는데, 그것을 작동시키고 디버깅하는데 문제가있다.OpenGL ES 2.0 텍스처가 검은 색으로 표시됩니다.
내가 지금까지 가지고있는 것의 관련 코드를 게시하려고합니다. 더 많이보고 싶다면 알려주세요.
편집 : 좋아, 그럼, texcoord 처리기로 실수를 수정 한 후, 나는 여전히 검은 색 사각형을 받고있어. glGetError가보고하는 유일한 시간은 GLES20.glEnable (GLES20.GL_TEXTURE_2D)를 호출 한 후입니다.
GLRectangle 관련 코드 :
@Override
public void onSurfaceCreated() {
ByteBuffer vertexByteBuffer = ByteBuffer.allocateDirect(vertices.length * 4);
vertexByteBuffer.order(ByteOrder.nativeOrder());
vertexBuffer = vertexByteBuffer.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
mProgram = createAndLinkProgram(VertexShaderHandle(), FragmentShaderHandle(), new String[] { "uMVPMatrix", "vPosition", "a_TexCoordinate" });
muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
maPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
loadTexture(context, imageId);
ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
ibb.order(ByteOrder.nativeOrder());
indexBuffer = ibb.asShortBuffer();
indexBuffer.put(indices);
indexBuffer.position(0);
ByteBuffer tbb = ByteBuffer.allocateDirect(texCoords.length * 4);
tbb.order(ByteOrder.nativeOrder());
textureCoordBuffer = tbb.asFloatBuffer();
textureCoordBuffer.put(texCoords).position(0);
}
그리고 onDrawFrame에서 :
GLES20.glUseProgram(mProgram);
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 12, vertexBuffer);
GLES20.glEnableVertexAttribArray(maPositionHandle);
Matrix.multiplyMM(mMVPMatrix, 0, projMatrix, 0, mvMatrix, 0);
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
mTextureUniformHandle = GLES20.glGetUniformLocation(mProgram, "u_Texture");
mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgram, "a_TexCoordinate");
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle);
GLES20.glUniform1i(mTextureUniformHandle, 0);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, GLES20.GL_UNSIGNED_SHORT, indexBuffer);
내가 알고있는, 또는 내가 INT 핸들을 가져올 적어도 나는, 비트 맵이로드되고 있음을 확신한다 로드 할 때 반환됩니다 (int가 0이면 런타임 오류가 발생합니다).
나는 그것이 텍스처 좌표와 관련이 있다고 생각합니다.
가 여기 내 텍스 좌표를 위해 내가 가진 무엇 :
int[] textureHandle = new int[1];
GLES20.glGenTextures(1, textureHandle, 0);
if (textureHandle[0] != 0) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
final Bitmap bitmap = BitmapFactory.decodeResource(view.getContext().getResources(), resourceId, options);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
}
if (textureHandle[0] == 0) {
throw new RuntimeException("Unable to load texture!");
}
mTextureDataHandle = textureHandle[0];
편집 :
는texCoords = new float[] {
0, 0,
0, 1,
1, 1,
1, 0
};
그냥 경우가 여기있다, 질감 로더 뭔가 내 쉐이더를 추가 잊으셨습니까 난 그냥 지금 코드를 문자열을 설정 해요 :
setVertexShader(
"uniform mat4 uMVPMatrix; \n" +
"uniform mat4 MVMatrix; \n" +
"attribute vec4 vPosition; \n" +
"attribute vec2 a_TexCoordinate; \n" +
"varying vec2 v_TexCoordinate; \n" +
"void main() { \n" +
"v_TexCoordinate = a_TexCoordinate; \n" +
"gl_Position = uMVPMatrix * vPosition; \n" +
"} \n");
setFragmentShader("precision mediump float; \n" +
"uniform sampler2D u_Texture; \n" +
"varying vec2 v_TexCoordinate; \n" +
"void main() { \n" +
"gl_FragColor = texture2D(u_Texture, v_TexCoordinate); \n" +
"} \n");
if (textureHandle [0]! = 0) {'은 ** 오류가 없는지 확인하는 방법이 아니라'glGetError'를 대신 사용하십시오. –
네 말이 맞아. 나는 그것을했고, 오류 코드 1280 GLES20.glEnable (GLES20.GL_TEXTURE_2D)에 – Ryan
당신은 셰이더를 사용하는 경우 텍스처에 대한 glEnable을 사용하지 마십시오. glEnable (GL_TEXTURE_2D)은 고정 함수 파이프 라인에만 사용되므로 opengles2.0에서 유효한 연산이 아닙니다. 선을 완전히 제거하십시오. – Tim