2012-07-31 4 views
1

임은 안드로이드에 게임을하지만 색상이 너무 반짝하고 내가 그래서 스프라이트를 변경 어차피 나는 쉐이더 구현하기로 결정 :개방 GLES 2 쉐이더 성능

const char* fETCShader = "\ 
uniform mediump sampler2D sTexture 
uniform mediump sampler2D sTexture_alpha 
\ 
varying mediump vec4 vColor 
varying mediump vec2 vTexCoord 
uniform lowp mat4 cCorrection 
\ 
void main()\ 
{\ 
    lowp vec4 color = vec4(texture2D(sTexture, vTexCoord).rgb, texture2D(sTexture_alpha, vTexCoord).r) * vColor 
    gl_FragColor = cCorrection * color 
}" 

을하지만, FPS는 (20 등) 극적으로 떨어

누구나이 작업을 수행하는 데 비용이 덜 드는 작업이 있는지 알 수 있습니다.

감사합니다.

답변

1

각각 3 채널과 1 채널로 2 개의 텍스처를 사용하는 대신 하나의 4 채널 RGBA 텍스처 만 만들면 1 텍스처 페치 만하면됩니다.

휴대 전화 조각화 셰이더가 매우 빠르게 병목 현상이됩니다. 항상 frag 쉐이더의 작업량을 최소화하려고 노력하십시오.

const char* fETCShader = "\ 
uniform mediump sampler2D sTexture 
uniform mediump sampler2D sTexture_alpha 
\ 
varying mediump vec4 vColor 
varying mediump vec2 vTexCoord 
uniform lowp mat4 cCorrection 
\ 
void main()\ 
{\ 
    gl_FragColor = cCorrection * texture2D(sTexture, vTexCoord) * vColor; 
}" 
+0

우리는 ETC 텍스처 형식을 사용하고 있습니다.이 형식은 RGB 채널 만 지원하므로 Shader에 표시된 것처럼 알파 채널을 저장하고 벡터 RGBA를 만들려면 강제로 추가 텍스처가 필요하다고 생각합니다. – elios264

+0

ETC2는 RGBA를 지원합니다. 그렇지 않으면 알파 값에 대한 정점 속성과 같은 몇 가지 트릭을 시도하거나 ETC 압축을 사용하지 마십시오. 메모리가 부족한 경우 텍스처 또는 스트리밍 텍스처를 사용할 필요가있을 때 크기를 줄이십시오. –

+0

안녕하세요! "알파 값에 대한 정점 속성"에 대해 좀 더 자세히 설명해 주시겠습니까? 이것은 꼭지점 쉐이더에서 sampler2D를 사용하고 나중에 쉐이더 쉐이더에서 나중에 사용하기 위해 결과를 쓰는 것을 의미합니까? – dimsuz

0

당신이 그들이 처음로드 할 때, 당신은 이전에 사용하던 어떤 메커니즘을 사용, 정확히 한 번 스프라이트를 변경할 수 없습니다 :

귀하의 쉐이더는 다음과 같이 보일 것인가? 실패하면 적어도 두 텍스처를 하나로 결합하십시오.