为什么我们使用模型视图投影matrix? 为什么着色器需要模型视图投影matrix?
在OpenGL中已经有很多关于文本渲染的问题,比如: 如何做一个GUI的OpenGL生活文字渲染? 但是大部分讨论的是使用固定functionstream水线渲染纹理四边形。 着色器必须做出更好的方法。 我并不十分关心国际化,我的大部分string都是绘图标记(date和时间或纯数字)。 但是这些图将以屏幕刷新率重新渲染,并且可能有相当多的文本(屏幕上不超过几千个字形,但硬件加速布局足够好)。 使用现代OpenGL进行文本渲染的build议方法是什么? (使用这种方法引用现有的软件是很好的证据,表明它运行良好) 几何着色器接受例如位置和方向以及字符序列并发出纹理四边形 呈现vector字体的几何着色器 如上所述,但使用曲面细分着色器 一个计算着色器来做字体光栅化
我想在C ++ builder中的窗体中初始化一个openGL框架。 我试图复制这里给出的OpenGL启动代码的内容: http : //edn.embarcadero.com/article/10528 我尝试用TFrame1replaceTForm1,然后把它放在窗体devise,但它没有工作。 如何正确地做到这一点,任何经验呢?
我已经在C ++中创build了一个包含opengl的程序,我也想创build一个obj加载器来加载一个obj文件。 我已经创build了两个function: void ReadFile(model *md) { // Open the file for reading OBJINFO.TXT ifstream obj_file("tree.obj"); if (obj_file.fail()) exit(1); // Get the number of vertices obj_file >> md->vertices; // Get the number of faces obj_file >> md->faces; // Get the vertex coordinates for (int i = 0; i < md->vertices; i++) { obj_file >> md->obj_points[i].x; […]
我为OpenGL 3.3创build了一个Mesh类,当我使用非默认的构造函数创build类时,它可以很好地工作,当我创build对象时创build顶点。 然而,我现在想要有多个对象,我可以通过将它们放在一个向量中dynamic创build,所以我必须添加一个默认的构造函数,我使用相同的函数来设置缓冲区数据,与其他构造函数一样…但它不工作。 就我所知,不是因为它在向量中的事实,而是与构造函数有关,或者是稍后创build缓冲区数据的事情。 我真的不太确定。 这是我的课程。 (当我创build一个可以工作的网格时,我使用参数调用构造函数,当它不起作用时,我构造一个没有参数的网格并调用“changeMesh”函数) mesh.h #ifndef MESH_H #define MESH_H #include <iostream> #include <vector> #include <GL/glew.h> #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/type_ptr.hpp> class mesh { public: mesh(); mesh(std::vector<GLfloat> vertices, std::vector<GLuint> triangles, GLuint shaderProgram); ~mesh(); void changeMesh(std::vector<GLfloat> vertices, std::vector<GLuint> triangles, GLuint shaderProgram); void render(); void Translate(glm::vec3 addVector); void Rotate(glm::vec3 rotVector, GLfloat angle); protected: private: […]
我没有select使用除opengl方法以外(即glxxx()方法())。 我只需要使用gl方法绘制文本。 读完红皮书后,我明白,只有通过glBitmap()方法才有可能。 如果这是唯一可能的方法,那么任何人都可以帮助我所有字符的像素数组信息。 有没有其他的方式来绘制文字?
我知道在每次调用glVertex之前,我必须先调用以下任一项: glTexCoord(0,0); glTexCoord(0,1); glTexCoord(1,1); glTexCoord(1,0); 但我不知道他们的意思。 但是我知道,如果我把两个(或者是这个分裂?)右边(或者全是那个?)乘以二,我的纹理就会扩展,如果我做相反的话,我的纹理会重复两次。 我已经设法通过应用操作来编写纹理图集,直到它工作。 但是我对发生了什么事有正确的想法。 为什么划分这些影响形象,为什么扭转它们呢? 纹理坐标如何工作?
有没有任何教程,解释了如何在OpenGL中绘制球体而不必使用gluSphere() ? 许多OpenGL的3D教程只是在立方体上。 我已经search,但绘制一个球体的大部分解决scheme是使用gluSphere() 。 还有一个网站有代码在这个网站上绘制一个球体,但它不能解释绘制球体的背后的math。 我也有其他版本的如何绘制在多边形领域,而不是四边形在该链接。 但是,我不明白这些代码是如何绘制的。 我希望能够可视化,以便我可以在需要时修改球体。
我正在重写我的纹理代码的很大一部分。 我想能够指定特定的内部格式:GL_RGB8I,GL_RGB8UI,GL_RGB16I,GL_RGB16UI,GL_RGB32I和GL_RGB32UI。 这些令牌在OpenGL 2中不存在。 当将这些内部格式指定为glTexImage2D的参数时,纹理化失败(纹理显示为白色)。 当检查错误时,我得到[编辑:] 1282(“无效操作”)。 我认为这意味着OpenGL仍在为glTexImage2D使用OpenGL 2,所以调用失败。 显然,它将需要使用更新的版本才能成功。 像GL_RGB,GL_RGBA和(奇怪)GL_RGB32F,GL_RGBA32F枚举像预期的那样工作。 我configuration使用GLEW或GLee进行扩展。 我可以在其他地方使用OpenGL 4调用(例如,glPatchParameteri,glBindFramebuffer等),并且当然存在枚举。 为了完整性,glGetString(GL_VERSION)返回“4.2.0”。 我的问题:我可以强制其中一个扩展库使用OpenGL 4.2版本? 如果是这样,怎么样? 编辑:代码太复杂,但是这里是一个简单的,独立的使用GLee的例子,也演示了这个问题: #include <GLee5_4/GLee.h> #include <GL/gl.h> #include <GL/glu.h> #include <gl/glut.h> //For Windows #pragma comment(lib,"GLee.lib") #pragma comment(lib,"opengl32.lib") #pragma comment(lib,"glu32.lib") #pragma comment(lib,"glut32.lib") #include <stdlib.h> #include <stdio.h> const int screen_size[2] = {512,512}; #define TEXTURE_SIZE 64 //Choose a selection. If you see […]
vec3types是一个非常好的types。 它只需要3个浮点数,而我有数据只需要3个浮点数。 我想在UBO和/或SSBO的结构中使用一个: layout(std140) uniform UBO { vec4 data1; vec3 data2; float data3; }; layout(std430) buffer SSBO { vec4 data1; vec3 data2; float data3; }; 然后,在我的C或C ++代码中,我可以这样做来创build匹配的数据结构: struct UBO { vector4 data1; vector3 data2; float data3; }; struct SSBO { vector4 data1; vector3 data2; float data3; }; 这是一个好主意吗?