1

간단한 쉐이더를 사용하여 알파 방사형 그래디언트 효과 (조명 종류)를 만들려고합니다. 효과가 올바르게 생성되지만 그래디언트가 부드럽 지 않습니다. 정밀도가 highp로 설정되었으므로 어디를 봐야할지 모르겠습니다.OpenGL ES 쉐이더의 알파 그래디언트가 부드럽 지 않습니다.

이 쉐이더는 현재 OpenGL ES 2.0을 사용하는 Android에서 실행 중입니다.

정점 :

precision highp float; 

attribute vec4 vPosition; 
attribute vec2 vStaticInterpolation; 

varying vec2 interpolator; 

void main() { 
    interpolator = vStaticInterpolation; 
    gl_Position = vPosition; 
} 

조각 :

precision highp float; 

uniform float alphaFactor; 
varying vec2 interpolator; 


float MAX_ALPHA = 0.75; 

void main() { 

    float x = distance(interpolator, vec2(0.0, 0.0)); 

    float alpha = MAX_ALPHA - MAX_ALPHA * x; 
    alpha = max(alpha, 0.0); 



    gl_FragColor = vec4(0.925, 0.921, 0.843, alpha); 
    gl_FragColor.a *= alphaFactor; 
} 
이 내 현재 쉐이더입니다

enter image description here

과 :

이 같은 그라데이션 현재 모습입니다

쉐이더는 vStaticInterpolation에서 보간에 대한 상수 속성 (-1.0에서 1.0까지)을받습니다. 실제 색상은 현재 셰이더에서 하드 코딩되어 있습니다.

+0

그냥 궁금해서, 어떤 형식 열심히에 의해 기억하려고,이 내 응용 프로그램의 코드의 일부입니다 귀하의 프레임 버퍼 무엇입니까? RGBA8 같은 것을? – Dannie

+0

표면이 RGB565였습니다. 이것이 문제였습니다. 아래의 답변이 정확합니다. – SirKnigget

답변

1

디더링 문제와 관련이있는 것으로 보입니다.

이것은 모바일 장치의 OpenGL 드라이버 구현에 따라 다를 수 있습니다 (현재 사용중인 모델을 모르지만). 과거에는 그게 문제였습니다. 당신이 수행 할 수

가능한 시험은 다음과 같습니다

  1. 안 OpenGL을 디더링 : 당신이 표면을 만들 때

    GLES20.glDisable(GLES20.GL_DITHER);

  2. 는 RGB888 표면을 부과. 일반적으로 ConfigChooser 함수에서 수행됩니다.

    새로운 AndroidGL.ConfigChooser (8, 8, 8, 8, 깊이, 스텐실) :

+0

감사합니다. RGB8888 표면을 부과하면 문제가 해결됩니다. – SirKnigget