Я пытаюсь нарисовать синий квадрат на дне комнаты.
Это код, который я пытался использовать, но здесь нет квадрата, только зеленый прозрачный цвет.
#include <iostream>
#include <vector>
#include <cmath>
#include <GL/glu.h>
#include <GL/freeglut.h>
bool keystates[256];
bool speckeystates[256];
// manage key events
void keys(unsigned char key, int x, int y) {
keystates[key]=true;
}
void keyup(unsigned char key, int x, int y) {
keystates[key]=false;
}
void skeys(int key, int x, int y) {
speckeystates[key]=true;
}
void skeyup(int key, int x, int y) {
speckeystates[key]=false;
}
void draw(void) {
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
gluLookAt(0,0,0,640,480,640,0,1,0); // from near-top-left to far-bottom-right, floor should be visible
glBegin(GL_QUADS);
glColor3ub(15,15,255); // visible blue color
glVertex3i(0,480,0); // draw quad across bottom
glVertex3i(640,480,0);
glVertex3i(640,480,640);
glVertex3i(0,480,640);
glEnd();
glFlush(); // flush drawing
glutSwapBuffers(); // swap the buffers
glutPostRedisplay();
}
int main(int argc, char** argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(640,480);
glutInitWindowPosition(0,0);
glutCreateWindow("Window!"); // init window stuff
glutDisplayFunc(draw); // our frame/draw event
glutKeyboardFunc(keys);
glutKeyboardUpFunc(keyup);
glutSpecialFunc(skeys);
glutSpecialUpFunc(skeyup); // init key event stuff
glEnable(GL_DEPTH_TEST); // init opengl stuff
glClearColor(0.2f,0.3f,0.2f,1.0f);
gluPerspective(45.0,640/480,0,640); // x: 0-640 y: 0-480 z: 0-640
glDepthFunc(GL_LEQUAL);
glutMainLoop(); // begin the loop
}
Я собираюсь ответить на ваш вопрос, но сначала я бы посоветовал вам попытаться забыть о функции glBegin, а также о glVertex / color и т. Д. Это очень устаревший API со времени, когда вызывается отрисовка (например, передача данных от оперативной памяти до графической памяти) был дешевле, чем сам рендеринг, поэтому не имело значения, что вы отправляли данные неэффективно, поскольку графической карте требовалось больше времени для обработки того, что вы отправили ей в последнем кадре, чем процессору и DMA чтобы получить данные из одной памяти в другую.
Спустя несколько лет, все было наоборот, поэтому стандарт был расширен и теперь включает VBO, поэтому вам не нужно отправлять каждую вершину с помощью отдельного вызова отрисовки, но они сохранили немедленный режим (который вы используете) для совместимости. причины.
В настоящее время немедленный режим (наконец-то) устарел, так что его плохая идея, вы можете найти несколько хороших руководств по новому API Вот
В любом случае, ваша проблема в том, как вы настраиваете свою камеру, вы стоите в точке 0,0,0 и смотрите на точку 640,480,640, что означает, что вершины будут определены в неправильном порядке, что приведет к их выбраковке, либо измените glulookat вызвать и инвертировать положение цели и глаза или изменить режим отбраковки
Других решений пока нет …