2013-05-25 3 views
0

Уважаемый Stackoverflowers,Fragmentshader и фреймбуфера сплошной цвет

В последнее время я делал свои первые шаги ребенка в мире шейдеры, используя GLSL и OpenGL в C# с OpenTK, и я наткнулся на некоторые проблемы, которые я, кажется, быть неспособным решить.

Я начал с одной программой шейдеров и некоторыми быстро экспериментальными шейдерами, которые работали хорошо, давая мне следующий результат (только зеленый и красный свет кружил треугольник):

Затем я хотел бы добавить какое-то от сияния к этому, и я слышал, что вам нужно было это сделать, применяя фрагментарный шейдер к текстуре. Итак, я отправил и снял свою сцену в фреймбуфер. Затем я связал текстуру фреймбуфера и нарисовал квадрат. Это показало мне ту же самую сцену, что и раньше, и это означало, что это сработало. Затем, чтобы использовать новый fragmentshader, я заменяю свою первую программу шейдера своей новой программой после того, как я написал в буфер и перед написанием квада. Теперь проблема в том, что все, что я делаю на экране, дает только один сплошной цвет, не делая никаких манипуляций, как хотелось бы.

Это мой рисунок код:

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; 
} 

Это приводит к твердой красного цвета, вместо того чтобы дать существующий образ красный оттенок.

Может ли кто-нибудь обнаружить проблему здесь?

+0

Правильно ли отображается изображение, если вы удаляете строку 'color.r + = 0.5f;'? Если вы изучите OpenGL и GLSL, я предлагаю изучить основные функции в 3.2 и выше и избежать устаревших частей (например, «changeing» устарел) –

ответ

0

Оказывается, что я забыл

GL.EnableClientState(ArrayCap.TextureCoordArray); 

Это означало, что мои УФ Coords не были переданы в затенение, таким образом делая выборку из всего (0,0), объясняя это поведение странного.

Смежные вопросы