2013-04-28 1 views
0

내 지형에서는 자체 네 가지 질감을 사용하는 쉐이더를 사용합니다. 그것은 윈도우와 리눅스 기계에서 잘 실행되지만, 안드로이드에서 그것은 두 은하계에서 ~ 25FPS 밖에 얻지 못합니다. 나는 텍스처가 문제라고 생각했지만, 문제는 텍스처 좌표를 나눠서 frac을 사용하여 타일 된 좌표를 얻는 부분에 문제가있는 것처럼 보였습니다. 그것 없이는, 나는 60FPS를 얻는다.Galaxy SII 및 SIII에서 매우 느린 파열 작업

// Material data. 
//uniform vec3 uAmbient; 
//uniform vec3 uDiffuse; 

//uniform vec3 uLightPos[8]; 
//uniform vec3 uEyePos; 
//uniform vec3 uFogColor; 
uniform sampler2D terrain_blend; 
uniform sampler2D grass; 
uniform sampler2D rock; 
uniform sampler2D dirt; 

varying vec2 varTexCoords; 
//varying vec3 varEyeNormal; 
//varying float varFogWeight; 

//------------------------------------------------------------------ 
// Name: fog 
// Desc: applies calculated fog weight to fog color and mixes with 
// specified color. 
//------------------------------------------------------------------ 
//vec4 fog(vec4 color) { 
// return mix(color, vec4(uFogColor, 1.0), varFogWeight); 
//} 

void main(void) 
{ 
    /*vec3 N = normalize(varEyeNormal); 
    vec3 L = normalize(uLightPos[0]); 
    vec3 H = normalize(L + normalize(uEyePos)); 

    float df = max(0.0, dot(N, L)); 
    vec3 col = uAmbient + uDiffuse * df;*/ 

    // Take color information from textures and tile them. 
    vec2 tiledCoords = varTexCoords; 
    //vec2 tiledCoords = fract(varTexCoords/0.05); // <========= HERE!!!!!!!!! 
    //vec4 colGrass = texture2D(grass, tiledCoords); 
    vec4 colGrass = texture2D(grass, tiledCoords); 
    //vec4 colDirt = texture2D(dirt, tiledCoords); 
    vec4 colDirt = texture2D(dirt, tiledCoords); 
    //vec4 colRock = texture2D(rock, tiledCoords); 
    vec4 colRock = texture2D(rock, tiledCoords); 
    // Take color information from not tiled blend map. 
    vec4 colBlend = texture2D(terrain_blend, varTexCoords); 
    // Find the inverse of all the blend weights. 
    float inverse = 1.0/(colBlend.r + colBlend.g + colBlend.b); 
    // Scale colors by its corresponding weight. 
    colGrass *= colBlend.r * inverse; 
    colDirt *= colBlend.g * inverse; 
    colRock *= colBlend.b * inverse; 

    vec4 final = colGrass + colDirt + colRock; 

    //final = fog(final); 
    gl_FragColor = final; 
} 

참고 : 약한 계산과 안개에 대한 코드가 더 있지만 사용되지는 않습니다. 주석 처리를하지 않으면 막대한 지연이 생기는 선을 지적했습니다. 바닥을 사용하고 분수 부분을 수동으로 계산하려했지만 지연은 동일합니다. 무엇이 잘못 되었을까요?

편집 : 이제 이해할 수없는 부분이 있습니다.

이 : 큰

vec2 tiledCoords = fract(varTexCoords * 2.0); 

실행됩니다.

이 :

vec2 tiledCoords = fract(varTexCoords * 10.0); 

런은 SIII에 평균.

이 :

vec2 tiledCoords = fract(varTexCoords * 20.0); 

이 래그 ...

이 : 음 5FPS 여전히 내가 기대했던 것보다 더

vec2 tiledCoords = fract(varTexCoords * 100.0); 

...

는 어떤 일이 있습니다? 왜 이런 일이 일어나는 걸까요? 나의 이해를 위해 이것은 어떤 차이를 가져서는 안된다. 하지만 그렇습니다. 그리고 거대한 것.

+0

''varTexCoords/0.05'' 부분을 제거하고''varTexCoords''로만 대체 해 보셨습니까? 또한''varTexCoords * 20.0''으로 변경할 수 있습니다. – harism

+0

이것은 내가 시도한 첫 번째 것이었고, 곱셈으로 나누는 부분은 아무 것도 바뀌지 않았습니다. – SMart

+1

필자가 추측하는 바는''fract'' 호출이 아니라 지연을 유발하는 텍스처 조회입니다. 4 개의 서로 다른 텍스처로 4 개의 텍스처 룩업을 사용하고 있습니다. 이제''texture2D''가''varTexCoords * 2.0''보다''varTexCoords * 2.0''으로 텍스처를 더 잘 버퍼링 할 수있게되면, 간단한''' 골절'전화. 물론 나는 추측하고있다. – harism

답변

0

프로필러 (Mali-400 확인)에서 코드를 실행하지만 모양으로 보았을 때 텍스처 캐시가 종료되었습니다. 계산 된 첫 번째 픽셀의 경우 4 개의 텍스처 조회가 모두 페치되지만 연속 데이터도 텍스처 캐시로 페치됩니다. 다음 픽셀의 경우 캐시의 데이터에는 액세스하지 않지만 그러한 캐시의 목적을 완전히 무시한 매우 먼 곳 (10, 20 ... 등)을 보게됩니다.

이것은 물론 적절한 프로파일 링이없는 추측은 말하기 어렵습니다.

편집 : @harism도 그 방향으로 당신을 지적했다.