함께

2011-08-03 5 views
1

서문

나는 다음과 같은립니다 테스트 응용 프로그램을 그려진 글자 :함께

GL.glBindTexture(GL.GL_TEXTURE_2D, texture); 

GL.glBegin(GL.GL_QUADS); 
{ 
    GL.glTexCoord2f(0, 1); GL.glVertex2f(0, 1); 
    GL.glTexCoord2f(0, 0); GL.glVertex2f(0, 0); 
    GL.glTexCoord2f(1, 0); GL.glVertex2f(1, 0); 
    GL.glTexCoord2f(1, 1); GL.glVertex2f(1, 1); 
} 
GL.glEnd(); 

텍스처가 FBO를 통해 렌더링됩니다.

문제

나는 힘든 시간을 함께 플레이하는 GL_TEXTURE_2D 및 GL_TEXTURE_3D을 만들고 있습니다. 나는 코드의 다음 섹션의 주석을 해제 할 때까지 모든 것이 잘 작동 : 나는 다음과 같은 이미지를 얻을 결과

GL.glEnable(GL.GL_TEXTURE_2D); 
// GL.glEnable(GL.GL_TEXTURE_3D); 

을 (2D 텍스처 작동이 중지) :

None

은 2D를 만들 수있는 방법이 있나요 3D 텍스처가 함께 작동합니까? FBO를 통해 3D 텍스처를 2D 텍스처로 렌더링해야합니다. 그렇게 할 수있는 방법이 있습니까? GL_TEXTURE_3D가 GL_TEXTURE_2D을 무시, GL_TEXTURE_1D을 무시합니다

전체 소스 코드

using System; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Drawing; 
using System.Threading; 
using System.Drawing.Imaging; 
using System.Collections.Generic; 
using System.Runtime.InteropServices; 

using OpenTK; 
using OpenTK.Graphics; 

using ManOCL; 
using Monobjc.OpenGL; 

using TextureTarget = OpenTK.Graphics.OpenGL.TextureTarget; 

namespace Test 
{ 
    class Program 
    {  
     static void InitViewport(INativeWindow wnd, IGraphicsContext ctx) 
     { 
      GL.glViewport(0, 0, wnd.Width, wnd.Height); 
      GL.glMatrixMode(GL.GL_PROJECTION); 
      GL.glLoadIdentity(); 
      GL.glMatrixMode(GL.GL_MODELVIEW); 
      GL.glLoadIdentity(); 

      Double aspect = 1; 

      if (wnd.Height > 0) 
      { 
       aspect = wnd.Width/(double)wnd.Height; 
      } 

      Double square = 2; 

      Double realWidth = square * aspect; 

      GL.glOrtho(-realWidth * 0.5, realWidth * 0.5, -square * 0.5, square * 0.5, -1, 1); 

      ctx.Update(wnd.WindowInfo); 
     } 

     static void InitGL(INativeWindow wnd, IGraphicsContext ctx) 
     { 
      GL.glShadeModel(GL.GL_SMOOTH); 

      GL.glEnable(GL.GL_TEXTURE_2D); 
//   GL.glEnable(GL.GL_TEXTURE_3D); 

      GL.glEnable(GL.GL_BLEND); 
      GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); 

      GL.glDisable(GL.GL_DEPTH_TEST); 

      GL.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
      GL.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     } 

     static uint CreateTexture2D(Int32 width, Int32 height) 
     { 
      uint texture; 

      GL.glGenTextures(1, out texture); 
      GL.glBindTexture(GL.GL_TEXTURE_2D, texture); 
      GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, width, height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, IntPtr.Zero); 
      GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); 
      GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); 
      GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP); 
      GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP); 
      GL.glBindTexture(GL.GL_TEXTURE_2D, 0); 

      return texture; 
     } 

     static uint CreateFBO() 
     { 
      uint fbo; 

      GL.glGenFramebuffers(1, out fbo); 

      return fbo; 
     } 

     [STAThread] 
     static void Main(string[] args) 
     { 
      Int32 strips = 32; 
      Int32 stripComponents = 6; 

      Random rand = new Random(); 

      INativeWindow wnd = new OpenTK.NativeWindow(800, 600, "OpenGL", GameWindowFlags.Default, GraphicsMode.Default, DisplayDevice.Default); 
      IGraphicsContext ctx = new GraphicsContext(GraphicsMode.Default, wnd.WindowInfo); 

      wnd.Visible = true; 
      wnd.Resize += delegate { InitViewport(wnd, ctx); }; 
      wnd.KeyPress += delegate(object sender, OpenTK.KeyPressEventArgs e) { 
       if (e.KeyChar == 'q') 
       { 
        wnd.Close(); 
       } 
       else if (e.KeyChar == '=' || e.KeyChar == '+') 
       { 
        Size size = wnd.Size; 
        Point location = wnd.Location; 

        wnd.Location = new Point(location.X - 16, location.Y); 
        wnd.Size = new Size(size.Width + 32, size.Height + 32); 
       } 
       else if (e.KeyChar == '-') 
       { 
        Size size = wnd.Size; 
        Point location = wnd.Location; 

        wnd.Location = new Point(location.X + 16, location.Y + 44); 
        wnd.Size = new Size(size.Width - 32, size.Height - 32); 
       } 
      }; 

      ctx.MakeCurrent(wnd.WindowInfo); 
      ctx.LoadAll(); 

      InitGL(wnd, ctx);   

      Int32 width = 512; 
      Int32 height = 512; 

      uint fbo = CreateFBO(); 
      uint texture = CreateTexture2D(width, height); 

      GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, fbo); 
      { 
       GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D, texture, 0); 

       GL.glPushAttrib(GL.GL_ALL_ATTRIB_BITS); 
       { 
        GL.glViewport(0, 0, width, height); 

        GL.glMatrixMode(GL.GL_PROJECTION); 
        GL.glLoadIdentity(); 
        GL.glMatrixMode(GL.GL_MODELVIEW); 
        GL.glLoadIdentity(); 

        GL.glOrtho(0, 1, 0, 1, -1, 1); 

        GL.glClearColor(0, 0, 0, 1.0f); 

        GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 

        GL.glBegin(GL.GL_TRIANGLES); 
        { 
         for (int i = 0; i < 50; i++) 
         { 
          GL.glColor4d(rand.NextDouble(), rand.NextDouble(), rand.NextDouble(), rand.NextDouble()); 
          GL.glVertex2d(rand.NextDouble(), rand.NextDouble()); 
          GL.glColor4d(rand.NextDouble(), rand.NextDouble(), rand.NextDouble(), rand.NextDouble()); 
          GL.glVertex2d(rand.NextDouble(), rand.NextDouble()); 
          GL.glColor4d(rand.NextDouble(), rand.NextDouble(), rand.NextDouble(), rand.NextDouble()); 
          GL.glVertex2d(rand.NextDouble(), rand.NextDouble()); 
         } 
        } 
        GL.glEnd(); 
       } 
       GL.glPopAttrib(); 
      } 
      GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0); 

      InitViewport(wnd, ctx); 

      while (wnd.Exists) 
      { 
       GL.glClear(GL.GL_COLOR_BUFFER_BIT); 

       GL.glPushMatrix(); 
       GL.glPushAttrib(GL.GL_TEXTURE_BIT | GL.GL_CURRENT_BIT); 
       { 
        GL.glTranslatef(-0.5f, -0.5f, 0); 

        GL.glPushMatrix(); 
        GL.glPushAttrib(GL.GL_TEXTURE_BIT | GL.GL_CURRENT_BIT); 
        { 
         GL.glTranslatef(-0.5f, 0f, 0); 

         for (int strip = 0; strip < strips; strip++) 
         { 
          GL.glBegin(GL.GL_TRIANGLE_STRIP); 
          { 
           for (int stripComponent = 0; stripComponent < stripComponents; stripComponent++) 
           { 
            GL.glColor4d(rand.NextDouble(), rand.NextDouble(), rand.NextDouble(), rand.NextDouble()); 
            GL.glVertex2d(rand.NextDouble(), rand.NextDouble()); 
           } 
          } 
          GL.glEnd(); 
         } 
        } 
        GL.glPopAttrib(); 
        GL.glPopMatrix(); 

        GL.glPushMatrix(); 
        GL.glPushAttrib(GL.GL_TEXTURE_BIT | GL.GL_CURRENT_BIT); 
        { 
         GL.glTranslatef(0.5f, 0f, 0); 

         GL.glColor4f(1, 1, 1, 1); 

         GL.glBindTexture(GL.GL_TEXTURE_2D, texture); 

         GL.glBegin(GL.GL_QUADS); 
         { 
          GL.glTexCoord2f(0, 1); GL.glVertex2f(0, 1); 
          GL.glTexCoord2f(0, 0); GL.glVertex2f(0, 0); 
          GL.glTexCoord2f(1, 0); GL.glVertex2f(1, 0); 
          GL.glTexCoord2f(1, 1); GL.glVertex2f(1, 1); 
         } 
         GL.glEnd(); 
        } 
        GL.glPopAttrib(); 
        GL.glPopMatrix(); 
       } 
       GL.glPopAttrib();    
       GL.glPopMatrix(); 

       ctx.SwapBuffers(); 
       wnd.ProcessEvents(); 
      } 
     } 
    } 
} 

답변

7

OpenGL은 텍스처 목표의 우선 순위를가집니다. 한 번에 하나의 대상 만 텍스처 단위에서 활성화 될 수 있으므로 우선 순위가 가장 높은 텍스처 대상이 샘플링 데이터를 제공합니다.

동시에 여러 텍스처를 사용하려면 (대상과 관계없이) 멀티 텍스쳐링을 사용해야합니다. 멀티 텍스쳐 튜토리얼을 사용하여 이들을 사용하는 방법을 이해하십시오. 고정 파이프 라인과 프로그램 가능 (= 셰이더) 파이프 라인에서 멀티 텍스쳐를 사용하는 방법에는 약간의 차이가 있습니다. http://www.clockworkcoders.com/oglsl/tutorial8.htm