opengl 相关问题

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

渲染部分不透明和部分完全透明的对象

当我尝试渲染透明对象时遇到问题。我只有一个网格,所以一个绘图调用,如果对象有点复杂,比如植物,我可以透过对象看到,你可以看到......

回答 1 投票 0

如何检测视图矩阵是左手矩阵还是右手矩阵?

我有一个从 GL 程序收到的相机视图矩阵。我知道这个矩阵是右手矩阵,因为这是 GL 的工作方式,但是我如何检查这个矩阵是右手矩阵还是左手矩阵 -

回答 3 投票 0

透过透明物体看到

当我尝试渲染透明对象时遇到问题。我只有一个网格,所以一个绘图调用,如果对象有点复杂,比如植物,我可以透过对象看到,你可以看到......

回答 1 投票 0

如何让texelFetch读取并返回整数?

函数 texelFetch 对于浮点数可以正常工作,但对于整数则不行。 这是浮动的工作示例。主机代码: 浮动测试[5][2] = { 2.0f, 2.0f }; GLuint tex; GLuint tbo; glGenBuffers(...

回答 1 投票 0

计算骨骼动画的最终骨骼变换

我有一个在搅拌机中制作的具有简单骨骼结构的简单模型。它看起来是这样的: 这是搅拌机中的层次结构: 正如你所看到的,它有两根骨头:一根向上延伸......

回答 1 投票 0

OpenGL:GL_R11F_G11F_B10F 的精度对于 8 位 RGB 图像来说好吗?

从“图像格式”中,我们看到: 11 位浮点数没有符号位;它有 6 位尾数和 5 位指数。 从“半精度浮点格式”中,我们可以推断出......

回答 1 投票 0

如何让glOrtho平行六面体旋转?

我的世界已呈现。根据一些具体要求,它(有时)包括地板上的一些灯。我使用三角形基元渲染这些灯光。现在我有以下...

回答 1 投票 0

QOpenGLWidget的resizeGL不是调用glViewport的地方?

我正在尝试新的 QOpenGLWidget 类(请注意,这不是 QGLWidget 类)。 我正在画一个三角形。我有一个简单的顶点着色器,它接收剪辑空间中的坐标,所以......

回答 1 投票 0

Qt Creator 的设置过剩[重复]

我想将 OpenGL 与 glut 与 Qt 创建者结合起来。 我使用的是Windows,我的QT版本是4.7.4,32位。 我按照教程进行操作: http://www.youtube.com/watch?v=1nzHSkY4K18 我也检查了一些...

回答 2 投票 0

未定义对 gluBuild2DMipmaps() 的引用?

其他信息: #包括 #包括 我可以用 dev++ 编译一个普通的 opengl 程序(旋转三角形),但是如果我想使用函数 gluBuild2DMipm...

回答 1 投票 0

C++ OpenGL --- 函数 gluBuild2DMipmaps 出现链接器错误

其他信息: #包括 #包括 嘿,我遇到了一个非常简单但毁灭灵魂的问题: 我可以编译一个普通的 opengl 程序(旋转三角形)...

回答 1 投票 0

对数深度缓冲区 OpenGL

我已经成功地在 OpenGL 中实现了对数深度缓冲区,这主要得益于 Outerra 的文章(您可以在此处、此处和此处阅读它们)。 但是,我遇到了一些问题,我不确定......

回答 3 投票 0

3D 空间中的 OpenGL“分层”条件/相对透明度 (Java)

我正在尝试将学习 OpenGL 作为一种爱好,为此,我正在尝试为《我的世界》(体素游戏)游戏制作一个模组,该模组添加了独特渲染的块。 游戏中,两者都有

回答 1 投票 0

边界填充错误地停止递归?

我一直在尝试使用 Visual Studio 代码在我的 m1 mac 上执行一个简单的边界填充程序,我在其中进行了设置,包括配置默认构建任务的所有库,并且构建是

回答 1 投票 0

glGetActiveAttribute() 读取错误的属性索引?

最小可重复示例 #包括 #include“glad.h” #包括 int main(int argc, char* args[]) { glfwInit();

回答 1 投票 0

在 OpenGL 顶点着色器中,w 是什么,为什么要除以它?

无效主(无效) { vec4 ClipCoord = glModelViewProjectionmatrix * gl_Vertex; gl_Position = 剪辑坐标; gl_FrontColor = gl_Color; vec3 ndc = 剪辑坐标.xyz / 剪辑坐标.w; 所以clipCoord是...

回答 1 投票 0

X 请求失败错误:GLXBadFBConfig

我正在尝试按照“交互式计算机图形”中的规定制作谢尔宾斯基垫片 基于着色器的 OPENGL® 的自顶向下方法”第 6 版。 我有这个代码 谢尔宾斯基.cpp #包括 我正在尝试按照“交互式计算机图形”中的指定制作谢尔宾斯基垫片 基于着色器的 OPENGL® 的自上而下方法” 第 6 版。 我有这个代码 谢尔宾斯基.cpp #include <GL/glew.h> #include <GL/glut.h> #include <glm/glm.hpp> #include "Angel.h" #include <iostream> #include <vector> #include <cmath> #define NUM_PUNTOS 4 #define DIVISIONES 5 namespace Global { GLint Ndivisions = DIVISIONES; GLint Nvertices = (GLint) std::pow(3,Ndivisions + 1); std::vector<glm::vec2> points; }; void display(void); void init(); //void idle(void); void triangle(glm::vec2,glm::vec2,glm::vec2,std::vector<glm::vec2> &); void divide_triangle(glm::vec2,glm::vec2,glm::vec2,GLint,std::vector<glm::vec2> &); inline glm::vec2 dividir(glm::vec2,double); glm::vec2 dividir(glm::vec2,double); int main(int argc, char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(800,600); glutInitContextVersion(3,2); glutInitContextProfile(GLUT_CORE_PROFILE); //IMPORTANTE: CREAR ANTES QUE LOS CALLBACKS glutCreateWindow("Sierpinski gasket"); //Init glewInit();//IMPORTANTÍSIMO init(); glutDisplayFunc(display); #ifdef LIBGL_DEBUG std::cout<<LIBGL_DEBUG<<'\n'; #endif //Despues de todo es que se crea la ventana glutMainLoop(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_POINTS, 0, Global::Nvertices); glFlush(); } void init() { //Inicializamos array global divide_triangle(glm::vec2(0.0,0.0),glm::vec2(1.0,0.0),glm::vec2(0.5,1.0),Global::Ndivisions,Global::points); glm::vec2 *points = &Global::points[0]; GLuint vao,program; program = Angel::InitShader("shaders/Sierpinski.vertex.glsl", "shaders/Sierpinski.fragment.glsl"); glUseProgram(program); for(int x = 0; x<Global::points.size();x++) std::cout<<"X: "<<points[x].x<<" Y: "<<points[x].y<<"\n"; glGenVertexArrays(1, &vao); glBindVertexArray(vao); //Buffers GLuint buffer; glGenBuffers(1, &buffer); std::cout<<"Primer test\n"; glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER,sizeof(points), points,GL_STATIC_DRAW); //glGenVertexArrays(1, &buffer); //glBindVertexArray(buffer); std::cout<<buffer<<'\n'; // Initialize the vertex position attribute from the vertex shader GLuint loc = glGetAttribLocation( program, "vPosition" ); glEnableVertexAttribArray( loc ); glVertexAttribPointer( loc, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) ); } void triangle(glm::vec2 a,glm::vec2 b,glm::vec2 c,std::vector<glm::vec2> &points) { size_t old_size = points.size(); points.resize(old_size + 3); points[old_size] = a; points[old_size + 1] = b; points[old_size + 2] = c; //std::cout<<"Finalizado\n"; } void divide_triangle(glm::vec2 a,glm::vec2 b,glm::vec2 c,GLint k,std::vector<glm::vec2> &points) { if(k>0) { glm::vec2 ab = dividir(a + b,2.0); glm::vec2 ac = dividir(a + c,2.0); glm::vec2 bc = dividir(b + c,2.0); //Dividimos triángulo int new_k = k - 1; divide_triangle(a,ab,ac,new_k,points); divide_triangle(c,ac,bc,new_k,points); divide_triangle(b,bc,ab,new_k,points); } else { triangle(a,b,c,points); } } glm::vec2 dividir(glm::vec2 vectorcito,double escalar) { return glm::vec2(vectorcito.x/escalar,vectorcito.y/escalar); } //void idle(void){} 天使.h ////////////////////////////////////////////////////////////////////////////// // // --- Angel.h --- // // The main header file for all examples from Angel 6th Edition // ////////////////////////////////////////////////////////////////////////////// #ifndef __ANGEL_H__ #define __ANGEL_H__ //---------------------------------------------------------------------------- // // --- Include system headers --- // #include <cmath> #include <iostream> // Define M_PI in the case it's not defined in the math header file #ifndef M_PI # define M_PI 3.14159265358979323846 #endif //---------------------------------------------------------------------------- // // --- Include OpenGL header files and helpers --- // // The location of these files vary by operating system. We've included // copies of open-soruce project headers in the "GL" directory local // this this "include" directory. // #ifdef __APPLE__ // include Mac OS X verions of headers # include <OpenGL/OpenGL.h> # include <GLUT/glut.h> #else // non-Mac OS X operating systems # include <GL/glew.h> # include <GL/freeglut.h> # include <GL/freeglut_ext.h> #endif // __APPLE__ // Define a helpful macro for handling offsets into buffer objects #define BUFFER_OFFSET( offset ) ((GLvoid*) (offset)) //---------------------------------------------------------------------------- // // --- Include our class libraries and constants --- // namespace Angel { // Helper function to load vertex and fragment shader files GLuint InitShader( const char* vertexShaderFile, const char* fragmentShaderFile ); // Defined constant for when numbers are too small to be used in the // denominator of a division operation. This is only used if the // DEBUG macro is defined. const GLfloat DivideByZeroTolerance = GLfloat(1.0e-07); // Degrees-to-radians constant const GLfloat DegreesToRadians = M_PI / 180.0; } // namespace Angel /*#include "vec.h" #include "mat.h" #include "CheckError.h"*/ #define Print(x) do { std::cerr << #x " = " << (x) << std::endl; } while(0) // Globally use our namespace in our example programs. //using namespace Angel; namespace Angel { // Create a NULL-terminated string by reading the provided file static char* readShaderSource(const char* shaderFile) { FILE* fp = fopen(shaderFile, "r"); if ( fp == NULL ) { return NULL; } fseek(fp, 0L, SEEK_END); long size = ftell(fp); fseek(fp, 0L, SEEK_SET); char* buf = new char[size + 1]; fread(buf, 1, size, fp); buf[size] = '\0'; fclose(fp); return buf; } // Create a GLSL program object from vertex and fragment shader files GLuint InitShader(const char* vShaderFile, const char* fShaderFile) { struct Shader { const char* filename; GLenum type; GLchar* source; } shaders[2] = { { vShaderFile, GL_VERTEX_SHADER, NULL }, { fShaderFile, GL_FRAGMENT_SHADER, NULL } }; GLuint program = glCreateProgram(); for ( int i = 0; i < 2; ++i ) { Shader& s = shaders[i]; s.source = readShaderSource( s.filename ); if ( shaders[i].source == NULL ) { std::cerr << "Failed to read " << s.filename << std::endl; exit( EXIT_FAILURE ); } GLuint shader = glCreateShader( s.type ); glShaderSource( shader, 1, (const GLchar**) &s.source, NULL ); glCompileShader( shader ); GLint compiled; glGetShaderiv( shader, GL_COMPILE_STATUS, &compiled ); if ( !compiled ) { std::cerr << s.filename << " failed to compile:" << std::endl; GLint logSize; glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &logSize ); char* logMsg = new char[logSize]; glGetShaderInfoLog( shader, logSize, NULL, logMsg ); std::cerr << logMsg << std::endl; delete [] logMsg; exit( EXIT_FAILURE ); } delete [] s.source; glAttachShader( program, shader ); } /* link and error check */ glLinkProgram(program); GLint linked; glGetProgramiv( program, GL_LINK_STATUS, &linked ); if ( !linked ) { std::cerr << "Shader program failed to link" << std::endl; GLint logSize; glGetProgramiv( program, GL_INFO_LOG_LENGTH, &logSize); char* logMsg = new char[logSize]; glGetProgramInfoLog( program, logSize, NULL, logMsg ); std::cerr << logMsg << std::endl; delete [] logMsg; exit( EXIT_FAILURE ); } /* use program object */ glUseProgram(program); return program; } } // Close namespace Angel block #endif // __ANGEL_H__ 我使用以下命令编译它 g++ Sierpinski.cpp -I. -lGL -lglut -lGLU -lGLEW -g -o Sierpinski.out 当我运行它时,出现以下内容: [asdrubal@localhost tests]$ ./Sierpinski.out libGL error: failed to load driver: i965 libGL error: Try again with LIBGL_DEBUG=verbose for more details. libGL error: failed to load driver: swrast libGL error: Try again with LIBGL_DEBUG=verbose for more details. X Error of failed request: GLXBadFBConfig Major opcode of failed request: 154 (GLX) Minor opcode of failed request: 34 () Serial number of failed request: 39 Current serial number in output stream: 38 有什么建议吗? P.S.:我现在正在使用 3.6.9-1-ARCH (Arch Linux) 编辑1: 着色器 谢尔宾斯基.fragment.glsl void main() { gl_FragColor = vec4(0.0,1.0,0.0,1.0); } Sierpinski.vertex.glsl #version 120 attribute vec4 vPosition; /*Si se quieren setear variables*/ void main() { gl_Position = vPosition; } LIBGL_DEBUG=verbose 的输出 [asdrubal@localhost tests]$ ./Sierpinski.out libGL: OpenDriver: trying /usr/lib32/dri/tls/i965_dri.so libGL: OpenDriver: trying /usr/lib32/dri/i965_dri.so libGL error: dlopen /usr/lib32/dri/i965_dri.so failed (/usr/lib32/dri/i965_dri.so: cannot open shared object file: No such file or directory) libGL error: unable to load driver: i965_dri.so libGL error: driver pointer missing libGL error: failed to load driver: i965 libGL: OpenDriver: trying /usr/lib32/dri/tls/swrast_dri.so libGL: OpenDriver: trying /usr/lib32/dri/swrast_dri.so libGL error: dlopen /usr/lib32/dri/swrast_dri.so failed (/usr/lib32/dri/swrast_dri.so: cannot open shared object file: No such file or directory) libGL error: unable to load driver: swrast_dri.so libGL error: failed to load driver: swrast X Error of failed request: GLXBadFBConfig Major opcode of failed request: 154 (GLX) Minor opcode of failed request: 34 () Serial number of failed request: 39 Current serial number in output stream: 38 编辑2: 命令: lspci | grep VGA 退货 00:02.0 VGA compatible controller: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (primary) (rev 03) Intel Corporation Mobile GM965/GL960 您正在运行第四代英特尔芯片,因此: glutInitContextVersion(3,2); 相当...乐观. 除非您想要软件渲染,在这种情况下,您将需要等待一段时间Mesa才能升级到OpenGL 3.2。 编辑: 尝试一下: #include <GL/glew.h> #include <GL/glut.h> #include <glm/glm.hpp> #include <iostream> #include <vector> #include <cmath> #include <stdexcept> using namespace std; // vertex shader const GLchar* vert = "#version 120\n" "attribute vec2 position;" "void main()" "{" " gl_Position = vec4( position, 0.0, 1.0 );" "}" ; // fragment shader const GLchar* frag = "#version 120\n" "void main()" "{" " gl_FragColor = vec4( 0.0, 1.0, 0.0, 1.0 );" "}" ; const unsigned int NUM_PUNTOS = 4; const unsigned int DIVISIONES = 5; namespace Global { GLint Ndivisions = DIVISIONES; GLint Nvertices = (GLint) std::pow(3.0,Ndivisions + 1); std::vector<glm::vec2> points; }; void triangle( glm::vec2 a, glm::vec2 b, glm::vec2 c, std::vector<glm::vec2> &points ) { size_t old_size = points.size(); points.resize(old_size + 3); points[old_size] = a; points[old_size + 1] = b; points[old_size + 2] = c; } glm::vec2 dividir( glm::vec2 vectorcito, double escalar ) { return glm::vec2(vectorcito.x/escalar,vectorcito.y/escalar); } void divide_triangle( glm::vec2 a, glm::vec2 b, glm::vec2 c, GLint k, std::vector<glm::vec2> &points ) { if(k>0) { glm::vec2 ab = dividir(a + b,2.0); glm::vec2 ac = dividir(a + c,2.0); glm::vec2 bc = dividir(b + c,2.0); //Dividimos triángulo int new_k = k - 1; divide_triangle(a,ab,ac,new_k,points); divide_triangle(c,ac,bc,new_k,points); divide_triangle(b,bc,ab,new_k,points); } else { triangle(a,b,c,points); } } void CheckStatus( const GLenum id ) { GLint status = GL_FALSE, loglen = 10; if( glIsShader(id) ) glGetShaderiv( id, GL_COMPILE_STATUS, &status ); if( glIsProgram(id) ) glGetProgramiv( id, GL_LINK_STATUS, &status ); if( GL_TRUE == status ) return; if( glIsShader(id) ) glGetShaderiv( id, GL_INFO_LOG_LENGTH , &loglen); if( glIsProgram(id) ) glGetProgramiv( id, GL_INFO_LOG_LENGTH , &loglen); vector< char > log( loglen, 'E' ); if( glIsShader(id) ) glGetShaderInfoLog( id, loglen, NULL, &log[0] ); if( glIsProgram(id) ) glGetProgramInfoLog( id, loglen, NULL, &log[0] ); throw logic_error( string( log.begin(), log.end() ) ); } GLuint CreateShader( const GLenum aType, const string& aSource ) { GLuint shader = glCreateShader( aType ); const GLchar* shaderString = aSource.c_str(); glShaderSource( shader, 1, &shaderString, NULL ); glCompileShader( shader ); CheckStatus( shader ); return shader; } GLuint CreateProgram( const string& aVertexShader, const string& aFragmentShader ) { GLuint vert = CreateShader( GL_VERTEX_SHADER, aVertexShader ); GLuint frag = CreateShader( GL_FRAGMENT_SHADER, aFragmentShader ); GLuint program = glCreateProgram(); glAttachShader( program, vert ); glAttachShader( program, frag ); glLinkProgram( program ); glDeleteShader( vert ); glDeleteShader( frag ); CheckStatus( program ); return program; } GLuint prog = 0; GLuint vbo = 0; void init() { GLenum glewError = glewInit(); if( GLEW_OK != glewError ) throw runtime_error( (char*)glewGetErrorString(glewError) ); cout << "GL_VERSION : " << glGetString(GL_VERSION) << endl; cout << "GL_VENDOR : " << glGetString(GL_VENDOR) << endl; cout << "GL_RENDERER : " << glGetString(GL_RENDERER) << endl; cout << "GLEW_VERSION : " << glewGetString(GLEW_VERSION) << endl; cout << "GLSL VERSION : " << glGetString(GL_SHADING_LANGUAGE_VERSION) << endl; if( !GLEW_VERSION_2_1 ) throw runtime_error( "OpenGL 2.1 or better required for GLSL support." ); // load shaders prog = CreateProgram( vert, frag ); //Inicializamos array global divide_triangle ( glm::vec2(0.0,0.0), glm::vec2(1.0,0.0), glm::vec2(0.5,1.0), Global::Ndivisions, Global::points ); // create/fill VBO glGenBuffers( 1, &vbo ); glBindBuffer( GL_ARRAY_BUFFER, vbo ); unsigned int numBytes = sizeof( glm::vec2 ) * Global::points.size(); glBufferData( GL_ARRAY_BUFFER, numBytes, &Global::points[0].x, GL_STATIC_DRAW ); } void display(void) { glClear( GL_COLOR_BUFFER_BIT ); glUseProgram( prog ); GLint position_loc = glGetAttribLocation( prog, "position" ); glBindBuffer( GL_ARRAY_BUFFER, vbo ); glVertexAttribPointer( position_loc, 2, GL_FLOAT, GL_FALSE, sizeof( glm::vec2 ), 0 ); glEnableVertexAttribArray( position_loc ); glDrawArrays( GL_POINTS, 0, Global::points.size() ); glDisableVertexAttribArray( position_loc ); glutSwapBuffers(); } int main(int argc, char **argv) { glutInit( &argc, argv ); glutInitWindowSize( 800,600 ); glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE ); glutCreateWindow( "Sierpinski gasket" ); init(); glutDisplayFunc( display ); glutMainLoop(); return 0; }

回答 1 投票 0

在我的光线行进着色器中,当物体经过原点光源附近时,为什么阴影会反转?

我正在使用有符号距离函数 (SDF) 在 OpenGL 着色器中实现光线行进阴影。光源放置在原点 (0,0,0),我使用光线行进来计算 sh...

回答 1 投票 0

为什么glfw窗口老是消失?

代码编译正常,但是当我执行 a.out 时,窗口出现一瞬间然后再次消失。 我怎样才能让它留在那里? 我正在 bodhi linux 5.15.0-78-generic 上编译 与 g++ -lG...

回答 1 投票 0

在 GLSL (OpenGL) 中计算向量交集

我想为场景添加雾。但我不想根据片段与相机的距离向片段颜色添加雾,而是想采用更现实的方法。我想计算距离,...

回答 1 投票 0

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