Fragment Shader GLSL의 색상 보간?
-
02-01-2020 - |
문제
스칼라 값을 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.);
. 제휴하지 않습니다 StackOverflow