标签: opengl

OpenGL中的帧缓冲区对象和像素缓冲区对象有什么区别?

FBO和PBO有什么区别?我应该使用哪一个用于离屏渲染?

opengl

45
推荐指数
4
解决办法
1万
查看次数

在Ubuntu中学习OpenGL

我正在尝试通过Nehe指南学习OpenGL并提高我的C++技能,但所有的例子都是针对Windows而我目前正在使用Linux.我真的不知道如何在Linux下工作,并且已经为Linux移植的网站上的代码中有更多的代码没有解释(到目前为止,我唯一得到的代码)工作是SDL的例子:http://nehe.gamedev.net/data/lessons/linuxsdl/lesson01.tar.gz).还有其他任何资源在Linux下对OpenGL更具针对性吗?

c++ linux opengl ubuntu

44
推荐指数
2
解决办法
7万
查看次数

为什么SDL和OpenGL有关?

我正在搞乱SDL,发现你不能用SDL旋转图像.问题到处都是,人们说使用OpenGL进行轮换.我一直认为SDL与OpenGL是完全分开的,我在思考这个问题时错了吗?我甚至找到了在SDL中使用OpenGL的教程,这让我更加困惑.SDL和OpenGL之间究竟有什么关系?为什么不使用OpenGL,如果它更强大,并允许你做更多(这是从我读过)?

c c++ opengl sdl

44
推荐指数
6
解决办法
3万
查看次数

如何计算Tangent和Binormal?

在OpenGL着色语言(GLSL)中讨论凹凸贴图,镜面高光和这些东西

我有:

  • 顶点数组(例如{0.2,0.5,0.1,0.2,0.4,0.5,...})
  • 法线数组(例如{0.0,0.0,1.0,0.0,1.0,0.0,...})
  • 点光源在世界空间中的位置(例如{0.0,1.0,-5.0})
  • 观众在世界空间中的位置(例如{0.0,0.0,0.0})(假设观众位于世界的中心)

现在,我如何计算每个顶点的Binormal和Tangent?我的意思是,计算Binormals的公式是什么,我必须根据这些信息使用什么?和切线相关?

无论如何我都会构建TBN矩阵,所以如果你知道根据这些信息直接构造矩阵的公式会很好!

哦,是的,如果需要,我也有纹理坐标.正如我所说的GLSL,我认为,每个顶点解决方案都是不错的,它不需要一次访问多个顶点信息.

----更新-----

我找到了这个解决方案

vec3 tangent;
vec3 binormal;

vec3 c1 = cross(a_normal, vec3(0.0, 0.0, 1.0));
vec3 c2 = cross(a_normal, vec3(0.0, 1.0, 0.0));

if (length(c1)>length(c2))
{
    tangent = c1;
}
else
{
    tangent = c2;
}

tangent = normalize(tangent);

binormal = cross(v_nglNormal, tangent);
binormal = normalize(binormal);

但我不知道它是否100%正确.

opengl math 3d glsl

43
推荐指数
3
解决办法
4万
查看次数

计算三角形网格中的法线

我画了一个有10000个顶点(100x100)的三角形网格,它将是一个草地.我使用了gldrawelements().我看了一整天,仍然无法理解如何计算这个法线.每个顶点是否有自己的法线或每个三角形都有自己的法线?有人能指出我正确的方向如何编辑我的代码以合并法线?

struct vertices {
    GLfloat x;
    GLfloat y;
    GLfloat z;
}vertices[10000];

GLuint indices[60000];

/*
99..9999
98..9998
........
01..9901
00..9900
*/

void CreateEnvironment() {
    int count=0;
    for (float x=0;x<10.0;x+=.1) {
        for (float z=0;z<10.0;z+=.1) {
            vertices[count].x=x;
            vertices[count].y=0;
            vertices[count].z=z;
            count++;
        }
    }
    count=0;
    for (GLuint a=0;a<99;a++){
        for (GLuint b=0;b<99;b++){
            GLuint v1=(a*100)+b;indices[count]=v1;count++;
            GLuint v2=(a*100)+b+1;indices[count]=v2;count++;
            GLuint v3=(a*100)+b+100;indices[count]=v3;count++;
        }
    }
    count=30000;
    for (GLuint a=0;a<99;a++){
        for (GLuint b=0;b<99;b++){
            indices[count]=(a*100)+b+100;count++;//9998
            indices[count]=(a*100)+b+1;count++;//9899
            indices[count]=(a*100)+b+101;count++;//9999
        }
    }
}

void ShowEnvironment(){
    //ground
    glPushMatrix();
    GLfloat GroundAmbient[]={0.0,0.5,0.0,1.0};
    glMaterialfv(GL_FRONT,GL_AMBIENT,GroundAmbient);
    glEnableClientState(GL_VERTEX_ARRAY);
    glIndexPointer( GL_UNSIGNED_BYTE, 0, indices ); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl normals computational-geometry

43
推荐指数
4
解决办法
5万
查看次数

在OpenGL中有一种方法可以获得着色器程序使用的所有制服和属性的列表吗?

我想得到一个着色器程序对象使用的所有制服和属性的列表. glGetAttribLocation()&glGetUniformLocation()可以用来将字符串映射到一个位置,但我真正想要的是字符串列表而不必解析glsl代码.

注意:在OpenGL 2.0中glGetObjectParameteriv()被替换为glGetProgramiv().而enum是GL_ACTIVE_UNIFORMS&GL_ACTIVE_ATTRIBUTES.

opengl 3d shader glsl

42
推荐指数
3
解决办法
2万
查看次数

覆盖3D全屏应用程序

我想在第三方全屏Windows应用程序上显示一些自定义图形.

你玩过任何Steam游戏吗?它有一个可执行的GameOverlayUI.exe,可以让你从游戏中访问Steam窗口.(GUI元素看起来是自定义绘制的,我不知道这是否是必要的;但它们在游戏中看起来与在桌面上看起来完全相同.)它甚至可以在游戏图形中"黯淡"的背景.

我想知道如何编写这样的应用程序.

我也想知道解决方案的范围有多广.你能为所有OpenGL应用程序使用一种方法吗?对于所有Direct3D减去DirectDraw应用程序?对于所有全屏Windows应用程序?

我正在寻找更多"现代"和通用的解决方案 - 覆盖命令提示符或320x240索引颜色应用程序不是一个问题.

编辑:一些澄清:全屏应用程序不是我的.它可以是任何东西.最有可能的是,它将是一款3D游戏.我希望在游戏图形的顶部显示屏幕右下角的数字时钟.如果可能的话,我想避免诸如注入代码或调试进程之类的技巧.

windows opengl directx overlay fullscreen

42
推荐指数
2
解决办法
3万
查看次数

OpenGL与OpenGL ES 2.0 - OpenGL应用程序可以轻松移植吗?

我正在开发各种游戏框架,并且是OpenGL的新手.大多数书籍似乎都没有对这个问题给出非常明确的答案,我希望使用OpenGL在我的桌面上进行开发,但是在OpenGL ES 2.0环境中执行代码.我的问题是双重的:

  1. 如果我在桌面上定位我的OpenGL框架,它是否会在OpenGL ES 2.0环境中运行而无需修改?
  2. 如果没有,那么那里有一个好的模拟器,PC或Mac; 是否有一个我可以运行的脚本,它将我的OpenGL代码转换为OpenGL ES代码,或标记不起作用的东西?

opengl opengl-es emulation opengl-to-opengles

42
推荐指数
1
解决办法
3万
查看次数

OpenGL的"绑定"功能背后的概念

我正在从本教程学习OpenGL .我的问题是关于一般的规范,而不是关于特定的功能或主题.查看以下代码时:

glGenBuffers(1, &positionBufferObject);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)

我对在设置缓冲区数据之前和之后调用绑定函数的效用感到困惑.由于我对OpenGL和计算机图形学一般缺乏经验,这对我来说似乎是多余的.

手册页说:

glBindBuffer允许您创建或使用命名缓冲区对象.与目标设定为GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER,GL_PIXEL_PACK_BUFFER或GL_PIXEL_UNPACK_BUFFER主叫glBindBuffer和缓冲设置为新的缓冲对象的名称绑定缓存对象名称的目标.当缓冲区对象绑定到目标时,该目标的先前绑定将自动中断.

将某些东西"绑定"到"目标"的概念/效用究竟是什么?

opengl

42
推荐指数
4
解决办法
2万
查看次数

gluPerspective参数 - 它们是什么意思?

我想知道gluPerspective参数.

在我看到的所有例子中fovy都设置为大约45-60度,我试图将其设置为不同的值,对象只是消失了对它的解释?

aspect值应始终比例是多少?为什么要改变它?

zNear, zFar - 再次通常的值大约是10和500+它反映的是什么?

opengl perspectivecamera perspective

42
推荐指数
1
解决办法
3万
查看次数