opengl 相关问题

OpenGL(开放图形库)是一种独立于平台的图形标准和API,可用于桌面,工作站和移动设备。它旨在提供硬件加速渲染,因此与传统软件渲染相比,性能大大提高。 OpenGL用于CAD软件和计算机游戏等应用程序。 OpenGL标准以及OpenGL ES由Khronos集团控制。

通过采样视图法线纹理计算出的世界法线纹理与世界法线纹理之间的差异

我有一个自定义渲染器功能,可以创建正常纹理并使用它。 普通纹理可以是视图或世界空间。 如果我创建视图空间法线纹理并使用完整的 uv 节点进行采样...

回答 1 投票 0

在 openGL 中使用索引缓冲区绘制立方体

#包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #include <stdio.h> #include <stdlib.h> #include <string> #include <iostream> #include <fstream> #include <vector> #include <algorithm> #include <GL/glew.h> #include <GL/glut.h> #include <GL/glm/glm.hpp> #include <GL/glm/gtx/transform.hpp> // rotate(), scale(), translate() #include <GL/glm/gtc/quaternion.hpp> #include <GL/glm/gtc/type_ptr.hpp> using namespace std; GLuint VertexArrayID; GLuint programID; float sx = 0; float sy = 0; bool projMode = true; // true: perspective, false: ortho GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) { //create the shaders GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); GLint Result = GL_FALSE; int InfoLogLength; //Read the vertex shader code from the file string VertexShaderCode; ifstream VertexShaderStream(vertex_file_path, ios::in); if (VertexShaderStream.is_open()) { string Line = ""; while (getline(VertexShaderStream, Line)) VertexShaderCode += "\n" + Line; VertexShaderStream.close(); } //Compile Vertex Shader printf("Compiling shader : %s\n", vertex_file_path); char const* VertexSourcePointer = VertexShaderCode.c_str(); glShaderSource(VertexShaderID, 1, &VertexSourcePointer, NULL); glCompileShader(VertexShaderID); //Check Vertex Shader glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); if (InfoLogLength > 0) { vector<char> VertexShaderErrorMessage(InfoLogLength); glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]); fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]); } //Read the fragment shader code from the file string FragmentShaderCode; ifstream FragmentShaderStream(fragment_file_path, ios::in); if (FragmentShaderStream.is_open()) { string Line = ""; while (getline(FragmentShaderStream, Line)) FragmentShaderCode += "\n" + Line; FragmentShaderStream.close(); } //Compile Fragment Shader printf("Compiling shader : %s\n", fragment_file_path); char const* FragmentSourcePointer = FragmentShaderCode.c_str(); glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, NULL); glCompileShader(FragmentShaderID); //Check Fragment Shader glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); if (InfoLogLength > 0) { vector<char> FragmentShaderErrorMessage(InfoLogLength); glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]); fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]); } //Link the program fprintf(stdout, "Linking program\n"); GLuint ProgramID = glCreateProgram(); glAttachShader(ProgramID, VertexShaderID); glAttachShader(ProgramID, FragmentShaderID); glLinkProgram(ProgramID); // Check the program glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); vector<char> ProgramErrorMessage(max(InfoLogLength, int(1))); glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]); fprintf(stdout, "%s\n", &ProgramErrorMessage[0]); glDeleteShader(VertexShaderID); glDeleteShader(FragmentShaderID); return ProgramID; } void renderScene(void) { //Clear all pixels glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Let's draw something here glBindVertexArray(VertexArrayID); //define the size of point and draw a point. glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0); //Double buffer glutSwapBuffers(); } void mouse(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { projMode = !projMode; } } void init() { //initilize the glew and check the errors. GLenum res = glewInit(); if (res != GLEW_OK) { fprintf(stderr, "Error: '%s' \n", glewGetErrorString(res)); } //select the background color glClearColor(1.0, 1.0, 1.0, 1.0); glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glDepthRange(0.0f, 1.0f); } GLfloat cubeVertices[] = { // front -0.1f, 0.1f, 0.1f, -0.1f,-0.1f, 0.1f, 0.1f,-0.1f, 0.1f, 0.1f, 0.1f, 0.1f, -0.1f, 0.1f, 0.1f, 0.1f,-0.1f, 0.1f, // back 0.1f, 0.1f,-0.1f, -0.1f,-0.1f,-0.1f, -0.1f, 0.1f,-0.1f, 0.1f, 0.1f,-0.1f, 0.1f,-0.1f,-0.1f, -0.1f,-0.1f,-0.1f, // left -0.1f,-0.1f,-0.1f, -0.1f,-0.1f, 0.1f, -0.1f, 0.1f, 0.1f, -0.1f,-0.1f,-0.1f, -0.1f, 0.1f, 0.1f, -0.1f, 0.1f,-0.1f, // right 0.1f, 0.1f, 0.1f, 0.1f,-0.1f,-0.1f, 0.1f, 0.1f,-0.1f, 0.1f,-0.1f,-0.1f, 0.1f, 0.1f, 0.1f, 0.1f,-0.1f, 0.1f, // bottom 0.1f,-0.1f, 0.1f, -0.1f,-0.1f,-0.1f, 0.1f,-0.1f,-0.1f, 0.1f,-0.1f, 0.1f, -0.1f,-0.1f, 0.1f, -0.1f,-0.1f,-0.1f, // top 1.1f, 0.1f, 0.1f, 0.1f, 0.1f,-0.1f, -0.1f, 0.1f,-0.1f, 0.1f, 0.1f, 0.1f, -0.1f, 0.1f,-0.1f, -0.1f, 0.1f, 0.1f, }; GLfloat cubeColors[] = { // red 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, // green 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, // blue 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, // yellow 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, // cyan 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, // magenta 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, }; /* idx | coord: 0 | (1,1,1) 1 | (-1, 1, 1) 2 | (-1,-1,1) 3 | (1, -1, 1) 4 | (1, -1, -1) 5 | (1, 1, -1) 6 | (-1, 1, -1) 7 | (-1, -1, -1) */ GLfloat cubeIndices[] = { // front 0, 1, 2, 0, 1, 3, // back 5, 6, 7, 5, 6, 4, // left 1, 2, 6, 1, 2, 7, // right 0, 3, 4, 0, 4, 5, // top 0, 1, 5, 0, 1, 6, // bottom 2, 3, 4, 2, 4, 7, }; int main(int argc, char** argv) { //init GLUT and create Window //initialize the GLUT glutInit(&argc, argv); //GLUT_DOUBLE enables double buffering (drawing to a background buffer while the other buffer is displayed) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); //These two functions are used to define the position and size of the window. glutInitWindowPosition(200, 200); glutInitWindowSize(480, 480); //This is used to define the name of the window. glutCreateWindow("Simple OpenGL Window"); //call initization function init(); //0. programID = LoadShaders("VertexShader.txt", "FragmentShader.txt"); glUseProgram(programID); /**************************************************/ // model matrix glm::mat4 model = glm::mat4(1.0f); float rotateAngle = 45.0f; glm::vec3 rotateAxis(0.0f, 1.0f, 0.0f); model = glm::rotate(model, glm::radians(rotateAngle), rotateAxis); glm::vec3 scaleVec(5.0f, 5.0f, 5.0f); model = glm::scale(model, scaleVec); glm::vec3 translateVec(0.0f, 0.0f, 0.0f); model = glm::translate(model, translateVec); // view matrix glm::mat4 view = glm::lookAt(glm::vec3(5.0f, -5.0f, -5.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); // proj matrix glm::mat4 proj; int width = glutGet(GLUT_WINDOW_WIDTH); int height = glutGet(GLUT_WINDOW_HEIGHT); if (projMode) { float aspectRatio = float(width) / height; proj = glm::perspective(glm::radians(45.0f), aspectRatio, 0.1f, 100.0f); } else { float orthoSize = 5.0f; proj = glm::ortho(-orthoSize, orthoSize, -orthoSize, orthoSize, 0.1f, 0.6f); } // model, view, proj matrix to shader GLint modelLoc = glGetUniformLocation(programID, "model"); glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); GLint viewLoc = glGetUniformLocation(programID, "view"); glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); GLint projLoc = glGetUniformLocation(programID, "proj"); glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(proj)); /**************************************************/ glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); float vtxs[] = { -0.5, 0.0, 0.0, 0.5, 0.3, 0.0 }; GLuint VBOs[3]; glGenBuffers(3, VBOs); glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]); glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * 3 * 2 * 6, cubeVertices, GL_STATIC_DRAW); GLuint posAttribLoc = glGetAttribLocation(programID, "inPos"); glVertexAttribPointer(posAttribLoc, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(0)); glEnableVertexAttribArray(posAttribLoc); glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]); glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 4 * 3 * 2 * 6, cubeColors, GL_STATIC_DRAW); GLuint colAttribLoc = glGetAttribLocation(programID, "color"); glVertexAttribPointer(colAttribLoc, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(0)); glEnableVertexAttribArray(colAttribLoc); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBOs[2]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(float) * 6 * 6, cubeIndices, GL_STATIC_DRAW); GLuint idxAttribLoc = glGetAttribLocation(programID, "index"); glVertexAttribPointer(idxAttribLoc, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(0)); glEnableVertexAttribArray(idxAttribLoc); glutDisplayFunc(renderScene); glutMouseFunc(mouse); //enter GLUT event processing cycle glutMainLoop(); glDeleteVertexArrays(1, &VertexArrayID); return 1; } 我想用上面的代码绘制一个 3D 立方体,但我得到一个白色的窗口。如何在窗口上显示 3D 立方体? 如果我对 VBO 和 IBO 使用像“VBOs”这样的数组,如上面的代码所示,会出现问题吗? 另外,你能告诉我如何绘制多个立方体吗? 最后,如果您告诉我我的代码中还有其他问题,我将非常感谢您。 我是一个完全的初学者,说实话,我并不完全理解图形管道。但我真的很感谢你对我的作业的帮助。 type的参数glDrawElements为整数1。 您已将索引定义为实数数组: GLfloat cubeIndices[] = { // front 0, 1, 2, 因此,当 glDrawElements 工作并读取 cubeIndices 的内存时,它会遇到一些巨大的值(例如,整数值 1 作为浮点数为 0x3f80'0000)。您定义的索引完全不在顶点属性数组确定的范围内。

回答 1 投票 0

将某些顶点复制到主机的最快跨平台方法是什么?

我正在开发一个应用程序,将相机姿势传递给 GPU,GPU 将生成包含有关对象可见顶点的不同信息(法线、深度……)的纹理 根据这些信息,我...

回答 1 投票 0

如何为用三角形绘制的“完美立方体”添加纹理?

我正在尝试在立方体上映射纹理,该立方体基本上是一个具有 8 个顶点和 14 个索引的三角形带: 静态常量 GLfloat 顶点[8] = { -1.f,-1.f,-1.f, -1.f,-1.f, 1.f, -1.f, 1.f,-...

回答 1 投票 0

OpenGL 不支持 Windows 上的共享上下文吗?

我正在开发一个跨平台 OpenGL 项目,当我尝试在 Windows 中加载它们时,似乎所有共享 GLcontext 的纹理都会遇到问题。有人告诉我这不是

回答 2 投票 0

为什么我的 OpenGL Win32 应用程序深度受到限制以及如何增加它?

当我的 OpenGL 场景 3D 超出“3D 视口深度”时,它会变成全黑,但我没有成功增加“相机深度远值”的值 这是我的整个代码,如果...

回答 1 投票 0

Mac 上 happy 的链接器标志是什么?

这是我的makefile SRC_DIR = src BUILD_DIR = 构建/调试 CC = 铿锵++ SRC_FILES = $(通配符$(SRC_DIR)/*.cpp) OBJ_NAME = 游戏 INCLUDE_PATHS = -Iinclude LIBRARY_PATHS = -Llib -Llib //用户/baguma/

回答 1 投票 0

如何解决OpenGL中调用glBufferSubData()时出现无效值错误

我有以下代码,当前从 OBJ 文件加载单个网格并渲染它: 导入pygame 从 pathlib 导入路径 从 pygame.locals 导入 * 从 OpenGL.GL 导入 * 来自 OpenGL.GL

回答 1 投票 0

向上或向下看时视锥体剔除会中断

标题解释了一切,但总结一下。当相机的方向不是向下或向上时,视锥体剔除工作正常(我通过控制台检查了绘制调用的数量等)。 但事实并非如此

回答 1 投票 0

具有多个存档的 C makefile

我有一个目录,其中包含一小部分业余爱好 OpenGL 程序的标头和源代码。我的目标是创建两个主要头文件:“toolbox.h”和“geometry.h”。 ...

回答 1 投票 0

在CPU上执行的数学在GPU上有不同的结果

我正在尝试让 GLSL 片段着色器根据纹理坐标扭曲传入片段,以不良地模拟 CRT。 代码无法运行后,我将其移植到C++来修改...

回答 1 投票 0

OpenGL 到 FFMpeg 编码

我有一个opengl缓冲区,我需要将其直接转发到ffmpeg以进行基于nvenc的h264编码。 我目前的做法是 glReadPixels 从帧缓冲区中获取像素,然后

回答 3 投票 0

顶点着色器中的位移贴图

我是opengl新手 我想使用顶点着色器制作地形。 我将位移图(geo_texture)映射到 256*256 顶点平面(网格) 顶点着色器: 输出 vec3 颜色; 输出 vec2 texCoo...

回答 1 投票 0

找不到-Ifreeglut

我正在 Code::Blocks 中从事 Glut 项目。我在 C 盘的 windows 文件夹中有 Freeglut.dll。我还在 sysWOW64 中复制了这个文件(因为我使用的是 Windows 10)。但它仍然给出错误...

回答 2 投票 0

视锥体剔除未利用 OpenGL 中的整个边界球

我的视锥体剔除正在检测被剔除的对象,即使整个对象的边界球体尚未脱离视锥体。就像它相信边界球体的半径小于...

回答 1 投票 0

在 OpenGL 中绘制 2D 纹理 [已关闭]

我有一个名为 DrawImage 的绘图函数,但它确实令人困惑,并且仅适用于特定形式的重塑函数,所以我有两个问题: 如何在 OpenGL 中绘制纹理? 我只是

回答 2 投票 0

OpenGL通过重新指定更新VBO数据

我正在尝试更改 VBO 的内容,但它用于流绘制,因此我试图理解并遵循此处(和此处)解释的概念,但当我尝试这样做时出现错误。 T...

回答 1 投票 0

如何使原始(0,0)坐标位于QGLWIdget的左上角?

我想使用QGLWidget显示图像,它没有以正确的方式显示,问题之一是原始坐标位于小部件的左下角。 我想知道如何制作...

回答 3 投票 0

如何频繁更新顶点缓冲区数据(每帧)opengl [重复]

我在屏幕上显示一个简单的2d三角形,我想每帧更新颜色缓冲区数据,因此三角形的颜色不断变化,但我不知道如何更新数据

回答 1 投票 0

如何创建动态大小的SSBO

我找遍了所有地方,但找不到使用DSA(直接状态访问)的。我需要一个具有动态大小的 SSBO,以便我可以更新我的实例,而不受 MAX_INSTANCE_COUNT 这样的限制......

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.