내 지형에서는 자체 네 가지 질감을 사용하는 쉐이더를 사용합니다. 그것은 윈도우와 리눅스 기계에서 잘 실행되지만, 안드로이드에서 그것은 두 은하계에서 ~ 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);
...
는 어떤 일이 있습니다? 왜 이런 일이 일어나는 걸까요? 나의 이해를 위해 이것은 어떤 차이를 가져서는 안된다. 하지만 그렇습니다. 그리고 거대한 것.
''varTexCoords/0.05'' 부분을 제거하고''varTexCoords''로만 대체 해 보셨습니까? 또한''varTexCoords * 20.0''으로 변경할 수 있습니다. – harism
이것은 내가 시도한 첫 번째 것이었고, 곱셈으로 나누는 부분은 아무 것도 바뀌지 않았습니다. – SMart
필자가 추측하는 바는''fract'' 호출이 아니라 지연을 유발하는 텍스처 조회입니다. 4 개의 서로 다른 텍스처로 4 개의 텍스처 룩업을 사용하고 있습니다. 이제''texture2D''가''varTexCoords * 2.0''보다''varTexCoords * 2.0''으로 텍스처를 더 잘 버퍼링 할 수있게되면, 간단한''' 골절'전화. 물론 나는 추측하고있다. – harism