2012-07-09 4 views
2

HTC Desire S에서 GLES2.0을 사용하는 앱을 만들었습니다. HTC에서는 작동하지만 Samung Galaxy 탭에서는 작동하지 않습니다. 프로그램을 연결할 수 없습니다 (GLES20.glGetProgramiv (mProgram, GLES20.GL_LINK_STATUS, linOk, 0)는 -1을 제공하고 glGetError()는 1282 (잘못된 연산) 오류를 발생시킵니다.버텍스 쉐이더가 갤럭시 탭 10 (tegra 2)에서 실행되지 않습니다

graph_coord.z = (texture2D(mytexture, graph_coord.xy/2.0 + 0.5).r); 

graph_coord.z = 0.2; 

는 갤럭시 탭도 작동

로 : 나는 (셰이더)이 라인을 대체

. 내 쉐이더는 다음과 같습니다

쉐이더 부착 어디
private final String vertexShaderCode = 
"attribute vec2 coord2d;" + 
"varying vec4 graph_coord;" + 
"uniform mat4 texture_transform;" + 
"uniform mat4 vertex_transform;" + 
"uniform sampler2D mytexture;" + 
"void main(void) {" + 
" graph_coord = texture_transform * vec4(coord2d, 0, 1);" + 
" graph_coord.z = (texture2D(mytexture, graph_coord.xy/2.0 + 0.5).r);" + 
" gl_Position = vertex_transform * vec4(coord2d, graph_coord.z, 1);" + 
"}"; 

:

mProgram = GLES20.glCreateProgram();    // create empty OpenGL Program 
    GLES20.glAttachShader(mProgram, vertexShader); // add the vertex shader to program 
    GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program 
    GLES20.glLinkProgram(mProgram);     // create OpenGL program executables 
    int linOk[] = new int[1]; 
    GLES20.glGetProgramiv(mProgram, GLES20.GL_LINK_STATUS, linOk,0); 

그리고 질감이 여기에로드됩니다

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture_id[0]); 
GLES20.glTexImage2D(
     GLES20.GL_TEXTURE_2D, // target 
    0,     // level, 0 = base, no minimap, 
    GLES20.GL_LUMINANCE,  // internalformat 
    size,     // width 
    size,     // height 
    0,     // border, always 0 in OpenGL ES 
    GLES20.GL_LUMINANCE,  // format 
    GLES20.GL_UNSIGNED_BYTE, // type 
    values 
); 
+1

당신이 그것을가 연결 할 수없는 이유로 프로그램 infolog (참조 glGetProgramiv를) 확인해 봤어? 셰이더 컴파일 상태를 확인 했습니까? 어떤 라인이 OpenGL 에러를 생성하고 있습니까? – Tim

+0

힌트를 보내 주셔서 감사합니다! 셰이더 infolog 읽습니다. "오류 C3004 : 함수"vec4 질감 "D (sampler2D, vec2);" 이 프로필에서 지원되지 않습니다. " – vipers36

답변

2

이의 제한 될 것으로 보인다 엔비디아 테그 라 GPU. Tegra 3 GPU에서 오류를 재연 할 수있었습니다. 버텍스 쉐이더의 텍스처 룩업은 OpenGL ES 2.0의 이론 부분이지만 엔비디아에 따르면 테그 라의 버텍스 쉐이더 텍스처 유닛 (GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS)의 수는 0 (PDF: OpenGL ES 2.0 Development for the Tegra Platform)입니다.

+0

대단히 고마워요! – vipers36

+0

OpenGL을 처음 사용하고 튜토리얼에서이 코드의 대부분을 복사했습니다. 여기에 가능한 작업은 무엇입니까? 아니면 z 좌표를 자바 코드? 모든 의견/제안에 감사드립니다. – vipers36

+0

버텍스 쉐이더에서 텍스처를 읽을 수있는 해결 방법을 모르겠습니다. 어떻게 데이터를 텍스처로 가져 옵니까? 입력은 쉐이더별로 (버텍스마다) 보내집니다. 당신이하고 싶은 것에 대한 좀 더 자세한 정보를 제공 할 수 있습니다. (이것은 일종의 높이 필드 렌더링입니까?) – kroneml

-1

texture2D() 대신 texture2DLod()을 사용해야 정점 쉐이더에서 텍스처를 찾을 수 있습니다.

GLSL 사양, 섹션 8.7 텍스처 조회 기능 : http://www.khronos.org/files/opengles_shading_language.pdf

+1

downvote 수는 없지만 사양은 * NOT *으로 표시합니다! 그것이 말하는 것은 texture2DLodX 함수가 오직 버텍스 쉐이더에서만 허용된다는 것입니다, 거기에 당신이 그것을 사용해야한다고 말하는 것은 아무것도 없습니다! –

+0

texture2DLod를 시도했으나 작동하지 않습니다. 나는 이것이 또한 빨간 청어라고 생각한다. – nmr