Задача OpenGL 2D Texture Mapping - PullRequest
       25

Задача OpenGL 2D Texture Mapping

2 голосов
/ 17 марта 2010

Я относительно новичок в OpenGL и у меня возникают некоторые проблемы при рендеринге изображения в качестве текстуры для QUAD с таким же размером изображения. Вот мой код Буду очень признателен, если кто-нибудь поможет мне решить эту проблему. Изображение выглядит намного меньше и сжимается. (Кстати, размеры изображения 500х375).

glGenTextures( 1, &S_GLator_InputFrameTextureIDSu );
        glBindTexture(GL_TEXTURE_2D, S_GLator_InputFrameTextureIDSu);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

        glTexImage2D( GL_TEXTURE_2D, 0, 4, S_GLator_EffectCommonData.mRenderBufferWidthSu, S_GLator_EffectCommonData.mRenderBufferHeightSu, 0, GL_RGBA, GL_UNSIGNED_BYTE, dataP);
glBindTexture(GL_TEXTURE_2D, S_GLator_InputFrameTextureIDSu);
        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, S_GLator_EffectCommonData.mRenderBufferWidthSu, S_GLator_EffectCommonData.mRenderBufferHeightSu, GL_RGBA, GL_UNSIGNED_BYTE, bufferP);
//set the matrix modes
        glMatrixMode( GL_PROJECTION );
        glLoadIdentity();
        //gluPerspective( 45.0, (GLdouble)widthL / heightL, 0.1, 100.0 );
        glOrtho (0, 1, 0, 1, -1, 1);
        // Set up the frame-buffer object just like a window.
        glViewport( 0, 0, widthL, heightL );
        glDisable(GL_DEPTH_TEST);
        glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );


        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();


        glBindTexture( GL_TEXTURE_2D, S_GLator_InputFrameTextureIDSu );


        //Render the geometry to the frame-buffer object


        glBegin(GL_QUADS); //input frame
            glColor4f(1.f,1.f,1.f,1.f);
            glTexCoord2f(0.0f,0.0f);    
            glVertex3f(0.f ,0.f ,0.0f);
            glTexCoord2f(1.0f,0.0f);    
            glVertex3f(1.f ,0.f,0.0f);
            glTexCoord2f(1.0f,1.f); 
            glVertex3f(1.f ,1.f,0.0f);
            glTexCoord2f(0.0f,1.f); 
            glVertex3f(0.f ,1.f,0.0f);
        glEnd();

Ответы [ 2 ]

1 голос
/ 17 марта 2010

Я думаю, я вижу, что вы здесь проблема. glViewport определяет размер области просмотра, а не размер окна. Поэтому, когда вы создаете свое окно (с помощью glut, sdl, или wgl, или чего-то еще), вы должны указать размер. Чтобы получить отображение glViewport 1: 1 в это окно, эти два значения должны совпадать.

0 голосов
/ 11 января 2011

Во-первых, размеры вашего изображения должны быть степенями двух, а не просто произвольными 500x375. Во-вторых, аргумент internalformat (третий) для glTexImage2D должен быть символической константой, описывающей макет внутреннего формата, а не просто "4", поскольку он устарел начиная с OpenGL 1.2. В-третьих, ваш dataP и bufferP макет хранилища должен соответствовать текущему GL_UNPACK_ALIGNMENT. В-четвертых, ваш равносторонний квад, на который вы пытаетесь нанести текстуру, по сути является квадратным, и, следовательно, ваша неквадратная текстура будет выглядеть сжатой или растянутой с такими координатами текстуры.

...