gpt4 book ai didi

opengl - 使用条件语句在颜色之间反弹而不是弹出

转载 作者:行者123 更新时间:2023-12-02 02:09:50 25 4
gpt4 key购买 nike

我最近一直在阅读一篇在线文章,以了解现代 3d OpenGL 编程的基本原理,但我被其中一篇“独立实践”评论所困。问题是这样的:

In fragChangeColor.cpp, change it so that the fragment program bounces between firstColor and secondColor, rather than popping from secondColor back to first at the end of a loop. The first-to-second-to-first transition should all happen within a single fragLoopDuration time interval. In case you are wondering, GLSL supports the if statement, as well as the ?: operator. For bonus points however, do it without an explicit conditional statement; feel free to use a sin or cos function to do this.

我遇到的问题是使用条件语句在两种颜色之间跳动,我对 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);
}

在该代码的某处,我需要包含某种条件语句,以便一旦三角形颜色达到最大值,它将开始减少颜色,直到达到白色,然后再次达到最大颜色,依此类推。我将如何去做这件事?我最初的猜测是使用某种静态 bool if 语句。

最佳答案

你想多了。这是你的 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/只需复制过去的代码并按编译(源面板左上角的小图标)

但完整保留此 block :

#ifdef GL_ES
precision highp float;
#endif

否则它不会工作。

关于opengl - 使用条件语句在颜色之间反弹而不是弹出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13409172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com