使用GLFW与OpenGL绘制点失败:仅显示背景无黄色点
OpenGL 绘制黄色点无显示问题排查与解决
问题描述
我想用OpenGL绘制简单图形并学习相关知识,但目前只能显示背景,设置的黄色点无法出现。我希望通过glBegin与glEnd完成绘制,坐标设为变量方便后续移动该点。代码大部分是GLFW初始化逻辑,怀疑问题出在draw_player函数中。曾尝试将glBegin的参数从GL_POINT改为GL_POINTS,但仍无效果。
原代码
#include <GLFW/glfw3.h> //#include <stdio.h> //coordinates int px, py; //My not working function void draw_player() { glColor3f(1.0f, 1.0f, 0); glPointSize(64.0f); glBegin(GL_POINTS); glVertex2i(px, py); glEnd(); } int main(int argc, char* argv[]) { GLFWwindow* window; if (!glfwInit()) return -1; window = glfwCreateWindow(910, 512, "Raycast", NULL, NULL); if (!window) { glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glClearColor(0.1f, 0.1f, 0.5f, 1.0f); //setting the coordinates px = 100; py = 10; while (!glfwWindowShouldClose(window)) { /* Render here */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); draw_player(); /* Swap front and back buffers */ glfwSwapBuffers(window); /* Poll for and process events */ glfwPollEvents(); } glfwTerminate(); return 0; }
问题原因与修复方法
核心问题:未配置投影矩阵与视口
OpenGL默认的裁剪空间是[-1, 1]的归一化坐标范围,你直接使用窗口像素坐标(100,10)会超出这个范围,导致点被裁剪,根本不会渲染到屏幕上。必须设置正交投影,把窗口像素坐标映射到OpenGL的裁剪空间里。
修复步骤
在glfwMakeContextCurrent(window);之后添加以下代码:
// 设置视口,匹配窗口尺寸 glViewport(0, 0, 910, 512); // 切换到投影矩阵模式 glMatrixMode(GL_PROJECTION); glLoadIdentity(); // 设置正交投影:左下角(0,0),右上角(910,512),深度范围-1到1 glOrtho(0, 910, 0, 512, -1, 1); // 切回模型视图矩阵模式,后续绘制用这个矩阵 glMatrixMode(GL_MODELVIEW); glLoadIdentity();
其他说明
GL_POINTS是正确的图元类型,你之前的修改没问题glVertex2i使用整数坐标完全可行,只要在投影范围内就会显示- 后续移动点的时候,只要
px和py在0-910、0-512范围内,就能正常显示
内容的提问来源于stack exchange,提问作者usernameisunavaible
相关产品推荐
相关产品推荐

