我正在尝试通过Nehe指南学习OpenGL并提高我的C++技能,但所有的例子都是针对Windows而我目前正在使用Linux.我真的不知道如何在Linux下工作,并且已经为Linux移植的网站上的代码中有更多的代码没有解释(到目前为止,我唯一得到的代码)工作是SDL的例子:http://nehe.gamedev.net/data/lessons/linuxsdl/lesson01.tar.gz).还有其他任何资源在Linux下对OpenGL更具针对性吗?
我正在搞乱SDL,发现你不能用SDL旋转图像.问题到处都是,人们说使用OpenGL进行轮换.我一直认为SDL与OpenGL是完全分开的,我在思考这个问题时错了吗?我甚至找到了在SDL中使用OpenGL的教程,这让我更加困惑.SDL和OpenGL之间究竟有什么关系?为什么不使用OpenGL,如果它更强大,并允许你做更多(这是从我读过)?
在OpenGL着色语言(GLSL)中讨论凹凸贴图,镜面高光和这些东西
我有:
现在,我如何计算每个顶点的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%正确.
我画了一个有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) 我想得到一个着色器程序对象使用的所有制服和属性的列表. glGetAttribLocation()&glGetUniformLocation()可以用来将字符串映射到一个位置,但我真正想要的是字符串列表而不必解析glsl代码.
注意:在OpenGL 2.0中glGetObjectParameteriv()被替换为glGetProgramiv().而enum是GL_ACTIVE_UNIFORMS&GL_ACTIVE_ATTRIBUTES.
我想在第三方全屏Windows应用程序上显示一些自定义图形.
你玩过任何Steam游戏吗?它有一个可执行的GameOverlayUI.exe,可以让你从游戏中访问Steam窗口.(GUI元素看起来是自定义绘制的,我不知道这是否是必要的;但它们在游戏中看起来与在桌面上看起来完全相同.)它甚至可以在游戏图形中"黯淡"的背景.
我想知道如何编写这样的应用程序.
我也想知道解决方案的范围有多广.你能为所有OpenGL应用程序使用一种方法吗?对于所有Direct3D减去DirectDraw应用程序?对于所有全屏Windows应用程序?
我正在寻找更多"现代"和通用的解决方案 - 覆盖命令提示符或320x240索引颜色应用程序不是一个问题.
编辑:一些澄清:全屏应用程序不是我的.它可以是任何东西.最有可能的是,它将是一款3D游戏.我希望在游戏图形的顶部显示屏幕右下角的数字时钟.如果可能的话,我想避免诸如注入代码或调试进程之类的技巧.
我正在开发各种游戏框架,并且是OpenGL的新手.大多数书籍似乎都没有对这个问题给出非常明确的答案,我希望使用OpenGL在我的桌面上进行开发,但是在OpenGL ES 2.0环境中执行代码.我的问题是双重的:
我正在从本教程学习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和缓冲设置为新的缓冲对象的名称绑定缓存对象名称的目标.当缓冲区对象绑定到目标时,该目标的先前绑定将自动中断.
将某些东西"绑定"到"目标"的概念/效用究竟是什么?
我想知道gluPerspective参数.
在我看到的所有例子中fovy都设置为大约45-60度,我试图将其设置为不同的值,对象只是消失了对它的解释?
该aspect值应始终比例是多少?为什么要改变它?
zNear, zFar - 再次通常的值大约是10和500+它反映的是什么?