2012-11-16 2 views
3

저는 최근에 최신 3D OpenGL 프로그래밍의 로프를 배우기 위해 온라인 기사를 읽었으며 "독립적 인 연습"리뷰 중 하나에 매달려 있습니다. 질문을 읽 단편 프로그램이 아닌 루프의 끝에서 다시 처음에 secondColor에서 터지는보다 firstColor 및 secondColor 사이 바운스되도록 fragChangeColor.cpp에서조건문을 사용하여 팝핑에 반대하는 색상들 사이 바운스

가 변경. first-to-second-to-first 전환은 모두 fragLoopDuration 시간 간격 내에 발생해야합니다. 궁금한 점이있는 경우 GLSL 은 if 문과? : 연산자를 지원합니다. 그러나 보너스가 포인트 인 경우 명시 적 조건문없이 수행하십시오. 죄 또는 cos 함수를 자유롭게 사용하십시오.

내가 두 색상을 반송 조건문을 사용하는 데 문제는, 나는 GLSL 쉐이더 언어의 지식을 제한했다. 다음 코드는 삼각형의 색이 천천히 증가 할 때까지 천천히 색을 증가시키고 색을 흰색으로 다시 나타냅니다. 어딘가에 내가 삼각형 색상이 최대의 도달하면 다시 등등 흰색, 후 최대 컬러에 도달 할 때까지 색상을 감소하기 시작합니다 있도록, 조건문의 일종을 포함 할 필요가 코드

#version 330 

out vec4 outputColor; 

uniform float fragLoopDuration; 
uniform float time; 

const vec4 firstColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); 
const vec4 secondColor = vec4(0.0f, 1.0f, 0.0f, 1.0f); 

void main() 
{ 
    float currTime = mod(time, fragLoopDuration); //makes the color pop from green to white once mod goes from 5 to 0 again 
    float currLerp = currTime/fragLoopDuration; 

    outputColor = mix(firstColor, secondColor, currLerp); 
} 

. 이 일을 어떻게하면 될까요? 내 초기 추측은 정적 일종의 if 문을 사용할 것입니다.

답변

2

당신은 그것을 생각할 것입니다. 여기 function plot

그리고 코드 예입니다

uniform float time; 

const vec4 firstColor = vec4(1.0, 1.0, 1.0, 1.0); 
const vec4 secondColor = vec4(0.0, 1.0, 0.0, 1.0); 

void main() 
{ 
    float lerp = abs(sin(time)); 
    gl_FragColor = mix(firstColor, secondColor, lerp); 
} 

당신은 방금 복사 과거의 코드를 눌러 컴파일 (소스 패널의 왼쪽 상단 모서리에있는 작은 아이콘) 온라인 http://www.iquilezles.org/apps/shadertoy/을 테스트 할 수

그러나 이 블록을 그대로 남겨 두었습니다 :

#ifdef GL_ES 
precision highp float; 
#endif 

또는 작동하지 않습니다.

+1

설명을 주셔서 감사합니다. –