0
親愛Stackoverflowers,Fragmentshader和framebuffer的純色
最近我一直在做我的第一個孩子步驟的着色器的世界,用GLSL和OpenGL在C#與OpenTK,和我偶然到一些問題,我似乎無法解決。
我開始了與一個着色器程序和一些後就正常了快速實驗着色器,讓我得到以下結果(僅綠光和紅光繞場三角形):
然後我想補充某種對此,我聽說你必須通過對紋理應用片段着色器來做到這一點。 所以我開始渲染我的場景到一個framebuffer。然後綁定framebuffer紋理並繪製出一個四邊形。這顯示了我以前的相同場景,這意味着它的工作。然後爲了使用新的碎片處理器,我在寫入緩衝區之前以及寫入四元組之前,用我的新程序替換了我的第一個着色器程序。現在的問題是,無論我做什麼屏幕只給出一個純色,不做任何我喜歡的操作。
這是我的繪製代碼:
protected override void OnRenderFrame(FrameEventArgs e)
{
GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, fboID);
GL.UseProgram(shaderProgramHandle);
GL.PushAttrib(AttribMask.ViewportBit);
{
GL.Viewport(0, 0, 600, 600);
// clear the screen in green, to make it very obvious what the clear affected. only the FBO, not the real framebuffer
GL.ClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit);
GL.PushAttrib(AttribMask.ColorBufferBit);
// make sure no lingering textures are bound to draw vertices clearly.
GL.BindTexture(TextureTarget.Texture2D, 0);
GL.EnableVertexAttribArray(0);
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 0, 0);
GL.DrawArrays(BeginMode.Triangles, 0, 3);
GL.DisableVertexAttribArray(0);
GL.Begin(BeginMode.Points);
GL.Vertex3(lmp);
GL.Vertex3(lmp2);
GL.End();
GL.PopAttrib();
}
GL.PopAttrib();
GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, 0);
angle += 0.01f;
angle2 -= 0.017f;
lmp = new Vector3((float)(2f * Math.Cos(angle)), (float)(Math.Sin(angle) * 2f), 0f);
lmp2 = new Vector3((float)(2f * Math.Cos(angle2)), (float)(Math.Sin(angle2) * 2f), 0f);
GL.Uniform3(uniformLmp, lmp);
GL.Uniform3(uniformLmp2, lmp2);
GL.UseProgram(secondProgram);
GL.Enable(EnableCap.Texture2D);
GL.ActiveTexture(TextureUnit.Texture0);
GL.BindTexture(TextureTarget.Texture2D, fboTex);
GL.Uniform1(GL.GetUniformLocation(secondProgram, "tex"), fboTex);
GL.Clear(ClearBufferMask.ColorBufferBit);
GL.Begin(BeginMode.TriangleStrip);
GL.TexCoord2(.0f, .0f);
GL.Vertex3(-1f, -1f, 0f);
GL.TexCoord2(1.0f, .0f);
GL.Vertex3(1f, -1f, 0f);
GL.TexCoord2(.0f, 1.0f);
GL.Vertex3(-1f, 1f, 0f);
GL.TexCoord2(1.0f, 1.0f);
GL.Vertex3(1f, 1f, 0f);
GL.End();
GL.Disable(EnableCap.Texture2D);
GL.UseProgram(0);
SwapBuffers();
}
而這些是我的着色器:
//vertex shader
#version 330
layout (location = 0) in vec3 Position;
varying vec2 texCoord;
void main()
{
gl_Position = vec4(Position.x, Position.y, Position.z, 1.0);
texCoord = gl_TexCoord[0].st;
}
//fragment shader
#version 330
uniform sampler2D tex;
out vec4 FragColor;
varying vec2 texCoord;
void main()
{
vec4 color = texture2D(tex, texCoord);
color.r += 0.5f;
FragColor = color;
}
這導致了堅實的紅色,而不是給現有的圖像的紅色色調。
任何人都可以在這裏發現問題嗎?
如果您刪除'color.r + = 0.5f;'行,圖像是否正確顯示?如果你學習OpenGL和GLSL,我建議學習3.2和更高版本的核心特性,並避免不推薦使用的部分(例如'不同的'已棄用) –