我迅速做了一個頂點/片段着色器,成功地插顏色:
#ifdef GL_ES
precision highp float;
#endif
uniform vec2 resolution;
void main(void)
{
vec2 p = gl_FragCoord.xy/resolution.xy;
float gray = 1.0 - p.x;
float red = p.y;
gl_FragColor = vec4(red, gray*red, gray*red, 1.0);
}
這裏的結果:
應用它在四,現在產量的正確的結果,因爲使用x
和y
座標真正在整個表面上完成插值。請參閱@ datenwolf的詳細說明,瞭解爲什麼這會起作用。
EDIT 1爲了獲得全範圍的功能性顏色選擇器的顏色,所以能夠交互式地修改色相(見https://stackoverflow.com/a/9234854/570738)。
Live在線演示:http://goo.gl/Ivirl
#ifdef GL_ES
precision highp float;
#endif
uniform float time;
uniform vec2 resolution;
const vec4 kRGBToYPrime = vec4 (0.299, 0.587, 0.114, 0.0);
const vec4 kRGBToI = vec4 (0.596, -0.275, -0.321, 0.0);
const vec4 kRGBToQ = vec4 (0.212, -0.523, 0.311, 0.0);
const vec4 kYIQToR = vec4 (1.0, 0.956, 0.621, 0.0);
const vec4 kYIQToG = vec4 (1.0, -0.272, -0.647, 0.0);
const vec4 kYIQToB = vec4 (1.0, -1.107, 1.704, 0.0);
const float PI = 3.14159265358979323846264;
void adjustHue(inout vec4 color, float hueAdjust) {
// Convert to YIQ
float YPrime = dot (color, kRGBToYPrime);
float I = dot (color, kRGBToI);
float Q = dot (color, kRGBToQ);
// Calculate the hue and chroma
float hue = atan (Q, I);
float chroma = sqrt (I * I + Q * Q);
// Make the user's adjustments
hue += hueAdjust;
// Convert back to YIQ
Q = chroma * sin (hue);
I = chroma * cos (hue);
// Convert back to RGB
vec4 yIQ = vec4 (YPrime, I, Q, 0.0);
color.r = dot (yIQ, kYIQToR);
color.g = dot (yIQ, kYIQToG);
color.b = dot (yIQ, kYIQToB);
}
void main(void)
{
vec2 p = gl_FragCoord.xy/resolution.xy;
float gray = 1.0 - p.x;
float red = p.y;
vec4 color = vec4(red, gray*red, gray*red, 1.0);
adjustHue(color, mod(time, 2.0*PI));
gl_FragColor = color;
}
編輯2:如果需要,對於紋理座標使用的着色器(對四邊形應用與紋理座標從0到1)應該是這個樣子。 未經測試。
片段着色器:
void main(void)
{
vec2 p = gl_TexCoord[0].st;
float gray = 1.0 - p.x;
float red = p.y;
gl_FragColor = vec4(red, gray*red, gray*red, 1.0);
}
直通頂點着色器:
void main()
{
gl_TexCoord[0]=gl_MultiTexCoord0;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
謝謝您的回答,我有經驗非常少GLSL雖然我似乎記得如果你想使用着色器,你必須實現一切,因爲它完全取代了OpenGL管道。有沒有簡單的方法來使用你提供的着色器,只將它應用到一次glDrawArrays()的調用? –
@意志財富:只要你堅持使用OpenGL-2.1及以下版本,你就可以有選擇地使用着色器。即大多數情況下使用固定功能管道,但只有一些着色器。只有OpenGL-3核心和更高版本*必須使用着色器。但老實說:使用着色器讓生活變得更簡單,所以我強烈建議在任何地方使用它們。 – datenwolf
@意志財富我通常會使用框架或圖形引擎來更容易地管理着色器。不過,我將此引用至:http://nehe.gamedev.net/article/glsl_an_introduction/25007/跳至「GLSL API如何在OpenGL應用程序中使用GLSL」部分。本節將向您展示如何在這些評論中更好地融入glsl着色器。 – num3ric