В чем разница между этими двумя вызовами OpenGL (Основной вопрос OpenGL)? - PullRequest
0 голосов
/ 18 декабря 2010

Это действительно глупый, основной вопрос, но: может кто-нибудь сказать мне, пожалуйста, разницу между:

glBegin(GL_QUADS);
glTexCoord3f(0, 0, 0); glVertex3f(0, 1, 0);
glTexCoord3f(1, 0, 0); glVertex3f(1, 1, 0);
glTexCoord3f(1, 1, 0); glVertex3f(1, 0, 0);
glTexCoord3f(0, 1, 0); glVertex3f(0, 0, 0);        
glEnd();

и

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
const GLfloat vertexData[] = {
    0,  0,  0,
    width,  0,  0,
    0,  height, 0,
    width,  height, 0
};
const GLfloat texCoords[] = {
    0,      0,
    1,      0,
    0,      1,
    1,      1
};  
glVertexPointer(3, GL_FLOAT, 0, &vertexData);
glTexCoordPointer(2, GL_FLOAT, 0, &texCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

(ширина и высота - это размер текстуры вpixel)

Я не могу понять, почему, но если я использую второй код (потому что OpenGL ES-совместимый), моя текстура на инвертированной оси Y.Что я делаю не так?

Редактировать:

Не знаю, если это уместно - возможно, я допустил ошибку при инициализации области просмотра для 2D-рисования?

GLint iViewport[4];
glGetIntegerv( GL_VIEWPORT, iViewport );
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();   
glOrtho( iViewport[0], iViewport[0]+iViewport[2], iViewport[1]+iViewport[3], iViewport[1], -1, 1 );
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

Ответы [ 3 ]

3 голосов
/ 18 декабря 2010

Придерживаясь самого простого, у вас есть 4 вершины с texcoords.Здесь они располагаются параллельно:

texcoord/vert
0, 0, / 0, 1
1, 0, / 1, 1
1, 1, / 1, 0
0, 1, / 0, 0

0, 0 /  0,  0
1, 0 /  width,  0
0, 1 /  0,  height
1, 1 /  width,  height

Теперь, если мы упорядочим их по вершинам, вы можете увидеть, что текскорды не соответствуют

// sorted verts by "alphabetical" position. 
0, 1, / 0, 0
0, 0, / 0, 1
1, 1, / 1, 0
1, 0, / 1, 1

0, 0 /  0,  0
0, 1 /  0,  height
1, 0 /  width,  0
1, 1 /  width,  height

Как видите, для каждогов эквивалентной позиции вторая координата текстуры инвертируется между 2. Это объясняет, почему текстуры перевернуты по оси y.

Так что, если вы хотите исправить это, просто переверните их на второй метод:

const GLfloat texCoords[] = {
    0,      1,
    1,      1,
    0,      0,
    1,      0
}; 
0 голосов
/ 18 декабря 2010

Хорошо, попробуйте эту полную программу GLUT. На самом деле я проверял это на этот раз :) 1001 *

#include <vector>
#include <GL/glut.h>

using namespace std;

size_t win_w = 0;
size_t win_h = 0;
double aspect_ratio = 0;

GLuint tex_obj;

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-10*aspect_ratio, 10*aspect_ratio, -10, 10, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, tex_obj);

    glPushMatrix();
    glScalef(5,5,0);

    /*
    glBegin(GL_TRIANGLES);
    glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
    glTexCoord2f(1, 0); glVertex3f(1, 0, 0);
    glTexCoord2f(1, 1); glVertex3f(1, 1, 0);
    glTexCoord2f(1, 1); glVertex3f(1, 1, 0);
    glTexCoord2f(0, 1); glVertex3f(0, 1, 0);        
    glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
    glEnd();
    */

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    const GLfloat vertexData[] = {
        0,  0,  0,
        1,  0,  0,
        1,  1,  0,
        1,  1,  0,
        0,  1,  0,
        0,  0,  0,
    };
    const GLfloat texCoords[] = {
        0,      0,
        1,      0,
        1,      1,
        1,      1,
        0,      1,
        0,      0,
    };  
    glVertexPointer(3, GL_FLOAT, 0, &vertexData);
    glTexCoordPointer(2, GL_FLOAT, 0, &texCoords);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);

    glPopMatrix();

    glFlush();
    glutSwapBuffers();
}

void reshape(int w, int h)
{
    win_w = w;
    win_h = h;
    aspect_ratio = (double)win_w / (double)win_h;
    glViewport(0, 0, w, h);
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);

    glutInitWindowSize(800,600);
    glutCreateWindow("Aspect Ratio");

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &tex_obj);
    glBindTexture(GL_TEXTURE_2D, tex_obj);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

    vector< unsigned char > pixels(4 * 3);
    pixels[3*0+0] = 255;    
    pixels[3*0+1] = 0;    
    pixels[3*0+2] = 0;    

    pixels[3*1+0] = 0;    
    pixels[3*1+1] = 255;    
    pixels[3*1+2] = 0;    

    pixels[3*2+0] = 0;    
    pixels[3*2+1] = 0;    
    pixels[3*2+2] = 255;    

    pixels[3*3+0] = 255;    
    pixels[3*3+1] = 255;    
    pixels[3*3+2] = 255;    

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, &pixels[0]);

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}
0 голосов
/ 18 декабря 2010

Попробуйте использовать одну и ту же геометрию в каждом случае:

Немедленный режим:

glBegin(GL_TRIANGLES);
glTexCoord2f(0, 0, 0); glVertex3f(0, 0, 0);
glTexCoord2f(1, 0, 0); glVertex3f(1, 0, 0);
glTexCoord2f(1, 1, 0); glVertex3f(1, 1, 0);
glTexCoord2f(1, 1, 0); glVertex3f(1, 1, 0);
glTexCoord2f(0, 1, 0); glVertex3f(0, 1, 0);        
glTexCoord2f(0, 0, 0); glVertex3f(0, 0, 0);
glEnd();

Вершинные массивы:

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
const GLfloat vertexData[] = {
    0,  0,  0,
    width,  0,  0,
    width,  height, 0
    width,  height, 0
    0,  height, 0,
    0,  0,  0,
};
const GLfloat texCoords[] = {
    0,      0,
    1,      0,
    1,      1
    1,      1
    0,      1,
    0,      0,
};  
glVertexPointer(3, GL_FLOAT, 0, &vertexData);
glTexCoordPointer(2, GL_FLOAT, 0, &texCoords);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...