You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:39:46