openGL推荐学习资料

网友投稿 570 2022-11-20

openGL推荐学习资料

openGL推荐学习资料

openGL系列文章目录

文章目录

​​openGL系列文章目录​​​​前言​​​​一、什么类型的人需要学习 OpenGL​​​​二、openGL推荐资料​​

​​1.[Interactive 3D Graphics](Real-Time Rendering, Fourth Edition​​​​cs291 video downloads​​​​learnopengl​​

​​总结​​

前言

个人感觉,学习openGL绝不是一蹴而就的事,必须要有长期学习的觉悟!!!否则就是从入门到放弃,当然那些天才不在此列,当我没说哈。 为什么怎么说,首先要绘制一个最简单的三角形,差不多小200行代码,这还是包含了 glew、glfw这些扩展库

// HelloTriangle.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "glew/glew.h"#include "glfw/glfw3.h"#include using namespace std;void framebuffer_size_callback(GLFWwindow* window, int width, int height);void processInput(GLFWwindow *window);const unsigned int SCR_WIDTH = 800;const unsigned int SCR_HEIGHT = 600;const char* vertexShaderSource ="#version 330 core\n""layout (location = 0) in vec3 aPos; \n""void main()\n""{\n"" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n""}\0";const char* fragmentShaderSource ="#version 330 core\n""out vec4 FragColor;\n""void main()\n""{\n"" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n""}\n\0";int main(){ if (!glfwInit()) { cout << "glfw init failed!" << endl; return -1; } glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //apple /*glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);*/ GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGLhellotriangle", NULL, NULL); if (window == nullptr) { cout << "Failed to create GLFW window" << endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); /******************** Attention!!!!! *******************************************************************/ /******************** 成功返回0,失败返回1, /********************* 这句代码必须放在glfwMakeContextCurrent(window);的后面,********************************/ /******************** 否则glew初始化失败 *******************************************************************/ /******************** glewInit()这句必需,否则后面的代码glCreateShader失败 ***********************************/ GLenum err = glewInit(); int vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr); glCompileShader(vertexShader); int success = 0; char infoLog[512]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); cout << "Error::Shader::Vertex::Compilation_Failed!\n" << infoLog << endl; } int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr); glCompileShader(fragmentShader); glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog); cout << "Error::Shader::Fragment::compilation_Failed!\n" << infoLog << endl; } int shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog); cout << "Error::Shader::Program::Linking_Failed!\n" << infoLog << endl; } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); GLfloat vertices[] = { -0.5f, -0.5f, 0.0f, //left 0.5f, -0.5f, 0.0f, //right 0.0f, 0.5f, 0.0f, //top }; unsigned int VBO; unsigned int VAO; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*)0); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); while (!glfwWindowShouldClose(window)) { processInput(window); glClearColor(0.2f, 0.2f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(shaderProgram); glBindVertexArray(VAO); //glDrawArrays(GL_POINTS, 0, 3); //绘制点 //glDrawArrays(GL_LINES, 0, 3); //绘制线 //glDrawArrays(GL_LINE_LOOP, 0, 3); //绘制连续封闭线,首尾相连 //glDrawArrays(GL_LINE_STRIP, 0, 3); //绘制连续线,首尾不相连 //glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); //绘制三角形 glDrawArrays(GL_TRIANGLE_FAN, 0, 3); glfwSwapBuffers(window); glfwPollEvents(); } glDeleteVertexArrays(1, &VAO); glDeleteBuffers(1, &VBO); glfwTerminate(); return 0;}void processInput(GLFWwindow* window){ if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { glfwSetWindowShouldClose(window, true); }}void framebuffer_size_callback(GLFWwindow* window, int width, int height){ glViewport(0, 0, width, height);}

一、什么类型的人需要学习 OpenGL

事实上在早年OpenGL即使在游戏领域也是对DirectX压倒性的优势。John Carmack曾嘲讽DirectX是“horribly broken” 的API。直到DirectX6时代OpenGL都被认为是比DirectX更加优秀的API,即使那个时候DirectX已经有《CS》《极品飞车5》等大作的支持,却依然不受当时FPS游戏霸主id Software的待见。作为那个时代的显卡杀手,《Quake III》都仅仅只支持OpenGL。DirectX7发布之后DirectX和OpenGL开始逐渐平起平坐。直到2000年DirectX8的发布才使DirectX在游戏领域完全确立了自己的优势 —— 支持革命性的programmable GPU rendering pipeline来代替原有的fixed function pipeline,引入了Vertex Shader和Pixel Shader。而OpenGL的核心正式支持programmable rendering pipeline已经是四年之后OpenGL 2.0发布的时候了。想想这中间会有多少游戏公司/游戏引擎公司会倒向DirectX吧。说到OpenGL衰落的原因,不得不提到OpenGL开发的机制。OpenGL早期一直是由ARB (OpenGL Architecture Review Board,成员包括Nvidia, ATI, Intel, Apple, IBM, SGI等等)成员共同维护。每个成员可以为了支持自己硬件新的feature来开发OpenGL enxtension, 所有成员一致通过的extension才能加入到下个版本OpenGL核心中。这就造成了不同成员为了各自利益互相斗争,拖慢了开发进度。微软曾经也是ARB的成员之一,后来因为受不了这种机制退出专心搞自己的DirectX去了。如果一个API越流行,那么去学习这个API的人就会越多,游戏公司会越容易招到掌握这个API的图形程序员,也就会更多的基于这个API开发游戏。用这个API的游戏越来越多,就会更多的得到硬件厂商的支持,为面向这个API的驱动做更多的优化,然后这个API就会更加流行。如此进入一个良性循环,这就造成了DirectX现在称霸游戏领域,OpenGL几乎绝迹的局面。在06年从ARB交由Khronos Group掌管之后, OpenGL最近几年也迎头赶上,从性能,易用性来说其实和DirectX已经相差不大。但是在相比DirectX没有突出优点的情况下(除了跨平台),已经习惯使用DirectX的游戏厂商也不可能重新投出OpenGL的怀抱。最后一点,OpenGL只是一个单纯的图形库,而DirectX是包含图形(Direct3D), 声音(DirectSound), 输入(DirectInput), 网络(DirectPlay)的一整套游戏开发解决方案。对开发者来说使用DirectX显然要方便的多。

二、openGL推荐资料

1.​​Interactive 3D Graphics​​

是英文的,线上课程。如果只是想学互动实时图形编程

2 Real-Time Rendering, Fourth Edition

​​Real-Time Rendering, Fourth Edition官网​​

cs291 video downloads

可-所有视频、英文字幕及其他资料。​​​cs291 video downloads官网​​

learnopengl

初学OpenGL最好的教程,没有之一​​​learnopengl英文官网​​​​learnopengl中文官网​​

总结

有更好的资源请大家也推荐给我吧,谢谢各位了

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:openGL增强表面细节----高度贴图
下一篇:openGL使用高度贴图模拟地球表面凹凸效果
相关文章

 发表评论

暂时没有评论,来抢沙发吧~