英文:
How to make a " homogeneous" gradient in glsl?
问题
#version 450
layout(binding=0) uniform UniformBufferObject {
mat4 model;
mat4 view;
mat4 proj;
} ubo;
layout(location=0) in vec2 inPosition;
layout(location=1) in vec3 inColor;
layout(location=2) in vec2 inUV;
layout(location=0) out vec3 fragColor;
vec3 azure = { 0.0f, 0.5f, 0.5f };
vec3 blue = { 0.0f, 0.0f, 1.0f };
vec3 green = { 0.0f, 1.0f, 0.0f };
float translate(float i) {
return i + 0.5;
}
float helpfunc(int x) {
return mix(mix(blue[x], green[x], translate(inPosition.y)), mix(azure[x], azure[x], translate(inPosition.y)), translate(inPosition.x));
}
void main() {
gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 0.0, 1.0);
fragColor = vec3(helpfunc(0), helpfunc(1), helpfunc(2));
}
英文:
I don't know what is the best description for my target effect, but I want it to look this:
I made these two attempts, where the color around diagonal line is more close to the right-down vertex.
<img src="https://i.stack.imgur.com/CBuSQ.jpg" width="300" height="300">
<img src="https://i.stack.imgur.com/GbCAJ.jpg" width="300" height="300">
#version 450
layout(binding=0) uniform UniformBufferObject {
mat4 model;
mat4 view;
mat4 proj;
} ubo;
layout(location=0) in vec2 inPosition;
layout(location=1) in vec3 inColor;
layout(location=2) in vec2 inUV;
layout(location=0) out vec3 fragColor;
vec3 azure = { 0.0f, 0.5f, 0.5f };
vec3 blue = { 0.0f, 0.0f, 1.0f };
vec3 green = { 0.0f, 1.0f, 0.0f };
float translate(float i) {
return i + 0.5;
}
float helpfunc(int x) {
return mix(mix(blue[x], green[x], translate(inPosition.y)), mix(azure[x], azure[x], translate(inPosition.y)), translate(inPosition.x));
}
void main() {
gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 0.0, 1.0);
fragColor = vec3(helpfunc(0), helpfunc(1), helpfunc(2));
}
I thought that this might be leaded by the color space, yet since after exchanging the position of blue
and green
in function helpfunc
, the color of the distinctive diagonal line changed, not the distinctive diagonal line postion. I guess the problem is in algorithm, but I can't figure out what it is or how to solve it.
答案1
得分: 1
感谢krOoze,我找到了解决我的问题的方法,因为我不知道它是否是最佳解决方案。
我所做的唯一一件事是将顶点着色器中的"计算颜色"步骤移到片段着色器中。
以下是我的代码:
// 顶点着色器
#version 450
layout(binding = 0) uniform UniformBufferObject {
mat4 model;
mat4 view;
mat4 proj;
} ubo;
layout(location = 0) in vec2 inPosition;
layout(location = 1) in vec3 inColor;
layout(location = 2) in vec2 inUV;
layout(location = 0) out vec2 outPosition;
void main() {
gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 0., 1.);
outPosition = inPosition;
}
// 片段着色器
#version 450
layout(location = 0) in vec2 outPosition;
layout(location = 0) out vec4 outColor;
vec3 red = {1.f, 0.f, 0.f};
vec3 blue = {0.f, 0.f, 1.f};
vec3 green = {0.f, 1.f, 0.f};
vec3 white = {1.f, 1.f, 1.f};
float translate(float i) {
return i + .5;
}
float helpfunc(int x) {
return mix(mix(blue[x], green[x], translate(outPosition.y)), mix(white[x], red[x], translate(outPosition.y)), translate(outPosition.x));
}
void main() {
outColor = vec4(helpfunc(0), helpfunc(1), helpfunc(2), 1.);
}
这是我的结果:
英文:
thks to krOoze, i find a way to solve my problem, since idk if it is the best solution.
the only thing i do is put the step "calculate the color" from vertex shader into frag shader.
here's my code:
//vertex shader
#version 450
layout(binding=0)uniform UniformBufferObject{
mat4 model;
mat4 view;
mat4 proj;
}ubo;
layout(location=0)in vec2 inPosition;
layout(location=1)in vec3 inColor;
layout(location=2)in vec2 inUV;
layout(location=0)out vec2 outPosition;
void main(){
gl_Position=ubo.proj*ubo.view*ubo.model*vec4(inPosition,0.,1.);
outPosition=inPosition;
}
//frag shader
#version 450
layout(location=0)in vec2 outPosition;
layout(location=0)out vec4 outColor;
vec3 red={1.f,0.f,0.f};
vec3 blue={0.f,0.f,1.f};
vec3 green={0.f,1.f,0.f};
vec3 white={1.f,1.f,1.f};
float translate(float i){
return i+.5;
}
float helpfunc(int x){
return mix(mix(blue[x],green[x],translate(outPosition.y)),mix(white[x],red[x],translate(outPosition.y)),translate(outPosition.x));
}
void main(){
outColor=vec4(helpfunc(0),helpfunc(1),helpfunc(2),1.);
}
and here is my outcome :
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论