尝试在屏幕上显示绘图时黑屏
Black screen while trying to display drawing on screen
我刚开始学习openGL,现在我遇到了一个问题,当我尝试制作一个可调整大小的窗口时,对象没有显示在窗口中,我不知道为什么。因此,如果有人可以快速浏览一下它的错误,那将是一个很大的帮助。此致敬意。
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
void initLights();
void reshape(int width, int height);
void display();
void renderScene();
int w;
int h;
int main(int argc, char** argv) {
glutInit(&argc, argv); //metodi se predaje dva argumenta - andresa varijable koja sadrži broj argumenata iz komandne linije, te polje tih argumenata
glutInitDisplayMode(GLUT_DOUBLE);
glEnable(GL_LIGHTING);
glutInitWindowSize(w, h); //dimenzije prozora u pikselima
glutInitWindowPosition(0, 0); //pozicija gornjeg lijevo kuta u kojem će se scena iscrtati, prvi argument je x, drugi y
glutCreateWindow("Primjer 1"); //stvaranje prozora u kojem će se iscrtati scena ("Naziv prozora")
glutDisplayFunc(display); //registracija metode display, vraća podatak tipa int koji se može koristiti kao identifikator prozora koji se kasnije koristi za uništavanje prozora
glutReshapeFunc(reshape); //registracija metode reshape
glutMainLoop(); //beskonačna petlja osluškivanja, generiranja događaja i pozivanje registriranih metoda koja obrađuje događaje
}
void initLights() {
// set up light colors (ambient, diffuse, specular)
GLfloat lightKa[] = {.5f, .5f, .5f, 1.0f}; // ambient light
GLfloat lightKd[] = {.7f, .7f, .7f, 1.0f}; // diffuse light
GLfloat lightKs[] = {1, 1, 1, 1}; // specular light
glLightfv(GL_LIGHT0, GL_AMBIENT, lightKa);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightKd);
glLightfv(GL_LIGHT0, GL_SPECULAR, lightKs);
// position the light
float lightPos[4] = {0, 0, 20, 1}; // positional light
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glEnable(GL_LIGHT0); // MUST enable each light source after configuration
}
void display() { //iscrtavanje scene, radi se pozivom metode glutDisplayFunc(display); kojoj kao argument predajemo pokazivač na samu metodu
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //brisanje površine platna, boja pozadine platna
glClear(GL_COLOR_BUFFER_BIT); //popunjavanje čitave površine platna prethodno definiranom bojom
glLoadIdentity();
// crtanje scene:
renderScene();
glutSwapBuffers();
}
void toPerspective(){
glDisable(GL_DEPTH_TEST); //isključivanje provjere z-spremnika koji se koristi u 3D sceni
glViewport(0, 0,w, h); //definicija dijela prozora koji prikazuje samu scenu
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, (double)w/(double)h, 1, 256);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void reshape(int width, int height) { //funkcija koja se koristi za promjenu veličine prozora
w = width;
h = height;
toPerspective();
}
void renderScene() {
glPointSize(6.0f);
glColor3f(0.0f, 1.0f, 1.0f);
glBegin(GL_POINTS);
glVertex2i(50, 50);
glVertex2i(150, 150);
glVertex2i(2, 2);
glVertex2i(4, 4);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2i(50, 50);
glVertex2i(150, 150);
glVertex2i(50, 150);
glVertex2i(50, 50);
glEnd();
glVertex2i(250, 250);
}
在您的代码中,由于模型视图矩阵是一个单位矩阵,相机位于 (0,0,0)。现在,投影是用 1 处的近平面构建的,这意味着在 z=0 处绘制的模型位于视锥体之外并被剔除。
另一个问题:您在glBegin/glEnd
之外至少调用一次glVertex2i
,这会导致 OpenGL 错误。
关于坐标:请注意,OpenGL 中的绘制不会在像素坐标中进行,除非您指定适当的投影来执行此操作。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- Qt自定义QPush按钮未显示在布局上
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 显示基于用户输入的整数的字符
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 单击"推送"按钮应使用Qt C++在不同的窗口中显示绘图
- 尝试在屏幕上显示绘图时黑屏
- 鼠标悬停时显示绘图值.-检测散射点
- 使用DirectX11进行Direct2D绘图:在显示图形上对齐矩形