문제

스칼라 값을 0에서 1 범위의 색상으로 매핑해야합니다. 녹색으로는 녹색에서 빨간색으로 이동 (0에서 1까지) 선형 보간 (0에서 1까지도) 나는 OpenGL 및 GLSL의 새로운 기능이며, 지금까지

에 색상 값을 쓸 필요가 있다는 것을 알아 냈습니다.
gl_FragColor
.

치수 4의 벡터 인

은 0에서 1.0까지의 범위가있는 하나의 스칼라 값으로 gl_fragcolor의 R, G 및 B 채널을 계산할 수있는 방법을 모르겠습니다 (녹색에서 빨간색으로 그리고 0.5로그것은 흰색이 될 것입니다)

도움이 되었습니까?

해결책

#version 120

...

float remap( float minval, float maxval, float curval )
{
    return ( curval - minval ) / ( maxval - minval );
} 

...

const vec4 GREEN = vec4( 0.0, 1.0, 0.0, 1.0 );
const vec4 WHITE = vec4( 1.0, 1.0, 1.0, 1.0 );
const vec4 RED   = vec4( 1.0, 0.0, 0.0, 1.0 );

float u = <whatever, grabbed from a uniform?>;
u = clamp( u, 0.0, 1.0 );
if( u < 0.5 )
    gl_FragColor = mix( GREEN, WHITE, remap( 0.0, 0.5, u ) );
else
    gl_FragColor = mix( WHITE, RED, remap( 0.5, 1.0, u ) );
.

또는 3 픽셀 1D 텍스처를 샘플링 할 수 있습니다.

다른 팁

범위 0에서 1 범위의 값이 val라는 경우 :

if (val < 0.5)
{
    gl_FragColor = vec4(2.0 * val, 1.0, 2.0 * val, 1.0);
}
else
{
    gl_FragColor = vec4(1.0, 2.0 * (1.0 - val), 2.0 * (1.0 - val), 1.0);
}
.

또는 분기 문을 피하고 싶다면 :

gl_FragColor = vec4(min(2.0 * val, 1.0),
                    min(2.0 * (1.0 - val), 1.0), 
                    2.0 * min(val, 1.0 - val),
                    1.0);
.

이것이 실제로 더 빨라지면 확실하지 않습니다.@ jessy가 지적한 것처럼, 컬러 버퍼가 정규화 된 형식을 갖는 경우 이것은 단순화 될 수 있습니다.이 경우 출력 색상이 자동으로 [0, 1] 범위에 자동으로 클램핑되어 BeneracodiceTag 코드가 불필요하게 호출됩니다.

gl_FragColor = vec4(2.0 * val,
                    2.0 * (1.0 - val), 
                    2.0 * min(val, 1.0 - val),
                    1.0);
.

GL_FRAGCOLOR가 0-1 사이에서 클램핑되므로 수동 클램핑에 대해 걱정할 필요가 없습니다.

float red = 2. * texel;
float green = 2. - red;
gl_FragColor = vec4(red, green, min(red, green), 1.);
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top