前言

openGL使用GLFW、GLEW库绘制点,下面这段代码:绘制蓝色背景,中心点是一个黄色的点,由于代码比较简单,所以我把顶点着色器和片元着色器硬编码到c++程序中。问题就在这!!!由于着色器都写在字符串中,造成着色器的错误很难排查。

#include "glew/glew.h"
#include "glfw/glfw3.h"
#include <iostream>using namespace std;static const unsigned int scr_width = 800;
static const unsigned int scr_height = 600;static const int numVAOs = 1;GLuint renderingProgram;
GLuint vao[numVAOs];static void error_callback(int error, const char* description)
{fprintf_s(stderr, "Error:%s\n", description);
}static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS){glfwSetWindowShouldClose(window, GLFW_TRUE);}
}GLuint createShaderProgram()
{const char* vShaderSource ="#version core 430                                \n""void main(void)                               \n""{                                             \n""  gl_Position = vec4(0.f, 0.f, 0.f, 1.f);     \n""}                                                \n";const char* fShaderSource ="#version core 430                                \n""out vec4 fragColor;                           \n""void main(void)                               \n""{                                              \n"" fragColor = vec4(1.0f, 1.0f, 0.0f, 1.0f);   \n""}                                                \n";GLuint vShader = glCreateShader(GL_VERTEX_SHADER);GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(vShader, 1, &vShaderSource, nullptr);glShaderSource(fShader, 1, &fShaderSource, nullptr);glCompileShader(vShader);glCompileShader(fShader);GLuint vfProgram = glCreateProgram();glAttachShader(vfProgram, vShader);glAttachShader(vfProgram, fShader);glLinkProgram(vfProgram);return vfProgram;
}void init(GLFWwindow* window)
{renderingProgram = createShaderProgram();//缓冲区最后都会被存入顶点数组对象VAO(Vertex Array Object)glGenVertexArrays(numVAOs, vao);glBindVertexArray(vao[0]);
}void display(GLFWwindow* window, double currentTime)
{glClearColor(0.f, 0.f, 1.f, 1.f);glClear(GL_COLOR_BUFFER_BIT);glUseProgram(renderingProgram);glPointSize(30.0f);glDrawArrays(GL_POINTS, 0, 1);
}int main(int argc, char** argv)
{int glfwState = glfwInit();if (GLFW_FALSE == glfwState){cout << "GLFW initialize failed. Invoke glfwInit()." << std::endl;glfwTerminate();exit(EXIT_FAILURE);}glfwSetErrorCallback(error_callback);glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);GLFWwindow* window = glfwCreateWindow(scr_width, scr_height, "Draw point", nullptr, nullptr);if (nullptr == window){cout << "GLFW create window failed! Invoke glfwCreateWindow()." << std::endl;//释放GLFW所有资源,直到调用glfwInit才能重新获取GLFW资源glfwTerminate();exit(EXIT_FAILURE);}//用于设置指定窗口的键回调,在按下、重复或释放键时调用该窗口glfwSetKeyCallback(window, key_callback);//调用线程上指定窗口的OpenGL或OpenGL ES上下文成为当前上下文。上下文一次只能在单个线程上成为当前上下文,并且每个线程一次只能有一个当前上下文。glfwMakeContextCurrent(window);int glewState = glewInit();if (GLEW_OK != glewState){cout << "GLEW initialize failed! Invoke glfwInit()." << std::endl;exit(EXIT_FAILURE);}//由于这些原因,应用程序通常希望将交换间隔设置为1。可以将其设置为更高的值,但通常不建议这样做,因为这样会导致输入延迟。glfwSwapInterval(1);init(window);while (!glfwWindowShouldClose(window)){display(window, glfwGetTime());glfwSwapBuffers(window);glfwPollEvents();}//销毁窗口,以及撤销窗口事件glfwDestroyWindow(window);glfwTerminate();exit(EXIT_SUCCESS);return 0;
}

程序运行结果:

问题定位

1.首先背景颜色是对的,但中间的点颜色不对,而且程序没有报错。可以确定GLFW、GLEW、openGL库这些都 没问题。
2.程序着色器貌似没有问题

问题解决


问题就在着色器程序上:

把 #version core 430
改成:
#version 430 core
或者
#version 430

程序运行正确

小结

以后要把着色器写在单独的着色器文档中,这样编译直接回报错,不然真的很难定位问题

程序源码下载

程序下载

openGL使用GLFW、GLEW库绘制点相关推荐

  1. macbook配置openGL环境(GLFW+GLEW)

    系统:macOS 12.2, M1 pro芯片 IDE:xcode 13.4 下载brew brew脚本安装 1.安装完后输入 brew -v 可能会提示让你输入 git config --globa ...

  2. Opengl+glfw+glew 大作业 绘制房间卧室客厅+雪花雪人

    一.开发环境说明 操作系统:windows 开发软件:Visual Studio 2017 编程语言:基于控制台下的opengl 用到的库: glfw .glew 底部提供代码下载 opengl环境配 ...

  3. 一张图弄懂opengl的诸多库gl glu glut freeglut glew glfw之间关系

    开始学习opengl,但是看opengl编程指南不同版本之间使用了一堆不同的库,概念名称全都搅起的,越看越糊涂,遂整理的一下opengl相关的一些库的名词, 才发现是不同时期不同版本不断发展的结果. ...

  4. OpenGL与gl glu glut freeglut glew glfw封装库关系(十五)

    1.概述     初学者往往搞不明白OpenGL与诸多库的联系下面一张图帮理清楚,gl glu glut freeglut glew glfw都是对OpenGL的封装而已.这些库已经将OpenGL.E ...

  5. OpenGL:ImGUI在GLFW库和GLAD/GLEW库的环境下使用

    步骤1:修改examples/imgui_impl_opengl3.h中的默认OpenGL3 loader 此处我使用的是GLAD库,使用GLEW库的话可以改成IMGUI_IMPL_OPENGL_LO ...

  6. (64位)opengl配置+vs2017+glew+glfw

    注意****本机OpenGL版本必须高于GLEW库版本 本机OpenGL版本如何查看? 只需先随意下载任意版本的glew解压,点击文件夹bin目录下的visualinfo.exe,屏幕一闪而过,这时该 ...

  7. OpenGL ES glut glew glfw glad freeglut

    目录 一.简介 1.freeglut 2.glew 3.glut 4.glfw 5.glad 二.分类 1.窗口管理 2.函数加载 三.组合使用 1.freeglut + glew 2.glfw + ...

  8. OpenGL学习之VS2017+glfw+glew/glad/freeglut的基本配置与中文教程汇总

    找了很多资料,就先马一下.教程都是原版英文的中文翻译教程,都有完整的代码. 基本配置方法(在VS2017上搭建glfw+glew或者glfw+glad) 1. OpenGL+VS2017 环境配置(亲 ...

  9. 【GIS开发】基于C++绘制三维数字地球Earth(OpenGL、glfw、glut)

    文章目录 1.计算公式 2.绘图接口 2.1 glDrawArrays 2.2 glDrawElements 3.代码实现 4.运行结果(整体地球) 4.1 opengl / glut / c++ ( ...

最新文章

  1. 这篇关于Netty底层的大科普,内部分享时被leader表扬了
  2. MySQL的一级索引和二级索引介绍,HBase中提到的二级索引【笔记自用】
  3. 【Python】Python的类和对象(长文系列第⑤篇)
  4. 思考问题的“六顶帽子”
  5. 实验吧之NSCTF misc250
  6. php获取周几,php怎么获得星期几
  7. delay在java中有什么用_DelayQueue怎么在Java多线程并发开发中使用
  8. java验证码制作思路_Java实现验证码制作之一自己动手
  9. Spring RestController
  10. Python::OS 模块简介
  11. ubuntu linux 14.04 apache,在 Ubuntu 14.04 中Apache从2.2迁移到2.4的问题
  12. Android App 启动时显示正在加载图片(源码)
  13. 远程计算机怎么桌面显示不全,桌面显示不全怎么设置
  14. Centos8装Wine笔记
  15. websphere html 缓存,如何清除WebSphere类缓存
  16. Dbeaver Phoenix 各种报错
  17. Dining POJ - 3281 (网络流)
  18. Git下载安装及使用说明
  19. 用计算机弹歌曲fade,抖音短视频踢脚舞是什么歌 Faded歌曲分享
  20. codechef November Challenge 2017解题报告

热门文章

  1. 优化大数据量查询方案——SpringBoot(Cloud)整合ES
  2. SSH远程连接linux虚拟机详细步骤(超详细)
  3. 【QML】QML性能优化 | 3D场景优化
  4. MySQL查看用户权限及权限管理
  5. Ubantu20.04 添加新硬盘,重新挂载/home目录
  6. linux中vim搜索
  7. 西安自助游全攻略~~~~~很全的哦~~
  8. 650c公路车推荐_沉睡十年,再获新生——记家中领导trek 650c公路车落地
  9. 大数据处理神器Beam
  10. callback (回调)函数讲解