Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 理解OpenGL中的glTexCoord2f()、glVertex3f()_C++_Opengl_Oculus - Fatal编程技术网

C++ 理解OpenGL中的glTexCoord2f()、glVertex3f()

C++ 理解OpenGL中的glTexCoord2f()、glVertex3f(),c++,opengl,oculus,C++,Opengl,Oculus,我正试图在我们研究所的汽车模拟器软件中加入OculusRift支持。由于模拟器软件的设置方式,我们决定修复由于镜头客户端使用OpenGL构建显示列表以运行第一个测试而导致的失真 基本上,我有点难以理解OpenGL是如何绘制图形的(用于显示列表)。我使用了不同教程中的信息,如果我理解正确,下面的for循环将选择Tex 0,1,2的坐标,进行一些渐晕并将其绑定到每个vetice。glBegin(GL\u三角形)将自动从顶点绘制三角形 顶点的坐标存储在地址ov指向的结构中。此外,我们还有每个颜色通道的

我正试图在我们研究所的汽车模拟器软件中加入OculusRift支持。由于模拟器软件的设置方式,我们决定修复由于镜头客户端使用OpenGL构建显示列表以运行第一个测试而导致的失真

基本上,我有点难以理解OpenGL是如何绘制图形的(用于显示列表)。我使用了不同教程中的信息,如果我理解正确,下面的for循环将选择Tex 0,1,2的坐标,进行一些渐晕并将其绑定到每个vetice。
glBegin(GL\u三角形)
将自动从顶点绘制三角形

顶点的坐标存储在地址
ov
指向的结构中。此外,我们还有每个颜色通道的偏移量

以下代码是从OpenGL视点截取的吗

ovrHmd_CreateDistortionMesh(pHmd, eyeRenderDesc[eyeNum].Eye, eyeRenderDesc[eyeNum].Fov,
ovrDistortionCap_Chromatic | ovrDistortionCap_Vignette, &meshData);

ovrDistortionVertex * ov = meshData.pVertexData;

// New compiled distortion-rendering display list
glNewList(drList, GL_COMPILE);

// Make triangles out of the vertices
glBegin(GL_TRIANGLES);

for (unsigned int vertNum = 0; vertNum < meshData.VertexCount; vertNum++) {
    // Tex0,1,2 have already been activated
    glMultiTexCoord2f(GL_TEXTURE0, ov->TanEyeAnglesR.x, ov->TanEyeAnglesR.y);
    glMultiTexCoord2f(GL_TEXTURE1, ov->TanEyeAnglesG.x, ov->TanEyeAnglesG.y);
    glMultiTexCoord2f(GL_TEXTURE2, ov->TanEyeAnglesB.x, ov->TanEyeAnglesB.y);
    glColor4f(
    (OVR::UByte)(ov->VignetteFactor * 255.99f),
    (OVR::UByte)(ov->VignetteFactor * 255.99f),
    (OVR::UByte)(ov->VignetteFactor * 255.99f),
    (OVR::UByte)(ov->TimeWarpFactor * 255.99f));
    glVertex3f(ov->ScreenPosNDC.x, ov->ScreenPosNDC.y, 0.5); // z: constant
    ov++;
}

glEnd();
glEndList();
ovrHmd\u创建扭曲网格(pHmd,eyerenderesc[eyennum]。Eye,eyerenderesc[eyennum]。Fov,
OVRDistorationCap|u色度| OVRDistorationCap|u渐晕图和网格数据);
ovrDistortionVertex*ov=meshData.pVertexData;
//新编译的失真渲染显示列表
glNewList(drList,GL_编译);
//用顶点制作三角形
glBegin(GL_三角形);
for(无符号int vertNum=0;vertNumTANEYANGLESR.x,ov->TANEYANGLESR.y);
glMultiTexCoord2f(GL_纹理1,ov->TANEYANGLESG.x,ov->TANEYANGLESG.y);
glMultiTexCoord2f(GL_TEXTURE2,ov->taneyanglesb.x,ov->taneyanglesb.y);
glColor4f(
(OVR::UByte)(ov->VignetteFactor*255.99f),
(OVR::UByte)(ov->VignetteFactor*255.99f),
(OVR::UByte)(ov->VignetteFactor*255.99f),
(OVR::UByte)(ov->TimeWarpFactor*255.99f));
glVertex3f(ov->ScreenPosNDC.x,ov->ScreenPosNDC.y,0.5);//z:常数
ov++;
}
格伦德();
格伦德利斯();
我正试图在我们研究所的汽车模拟器软件中加入OculusRift支持。由于模拟器软件的设置方式,我们决定修复由于镜头客户端使用OpenGL构建显示列表以运行第一个测试而导致的失真

就停在那里您的目标是VR显示,这意味着您必须使用能够获得的最高性能的绘制方法来绘制动态网格(时间扭曲所需)。显示列表无法执行此操作。实际上,即时模式(
glBegin
glEnd
)会产生大量的CPU开销,这正是您不希望的

glColor4f(
  (OVR::UByte)(ov->VignetteFactor * 255.99f),
  (OVR::UByte)(ov->VignetteFactor * 255.99f),
  (OVR::UByte)(ov->VignetteFactor * 255.99f),
  (OVR::UByte)(ov->TimeWarpFactor * 255.99f));

glColor4f
要求浮点值限制在0和1之间。但是,您正在传递字节。可能您将其与显示列表相混淆,glBegin/glEnd已被弃用。相反,创建VBO并使用着色器即使它们已被弃用,它们仍然应该工作(我确实倾向于使用它们,完全是出于懒惰:)。你的代码看起来还可以,你能告诉我们什么不起作用吗?@ratchetfreak该软件本身主要用于开发汽车控制系统,可以让你驾驶汽车。实际情况是,该软件是用带有c/c++扩展的TCL脚本语言编写的,我不能仅仅重写整个渲染过程。OVR支持将是实验性的(没有时间扭曲),并且将通过调用作为OculusSDK的TCL包装的DLL来实现。因此使用了显示列表。@martin_pr因为我是OpenGL新手,我只想知道我是否正确理解了glTexCoord glColor和glVertex必须使用的方式,请按顺序调用。从您的评论来看,这样看起来还行;)是的,glTexCoord和glColor将在glVertex之前调用。不过,这些函数有点古老,下面对答案的评论也有一个要点:)我将此作为我的论文进行开发,以供实验使用(有关更多信息,请参见我上面的评论)。开发该软件并帮助我的人告诉我,我可以在没有时间扭曲的情况下获得一些初步实验结果(使用常数),为此,使用“一次性”创建的显示列表就足够了。@Skaveelicous:即使是这样,您也在迭代某些网格数据结构的顶点。只需将网格数据导入OpenGL顶点数组并执行单个
glDrawArrays
调用要比手动迭代更容易。实际上,简单地让SDK进行失真渲染更容易,或者如果由于某种原因无法实现,则直接将OpenGL代码从Oculus SDK中拉出以进行失真(这是公开来源)杰里科,很高兴在这里见到你。我正在为一个现有的软件做一种学术实验(没有时间扭曲)解决方案。那个知道软件“进进出出”的家伙告诉我最好的办法是把扭曲网格作为显示列表交给他。他将在他的呈现循环中调用我作为DLL加载到TCL脚本语言中的函数,并获取显示列表Id。我尝试了你所说的,但SDK中大量使用类使我迷失方向。此外,我还被告知他们仍然在使用OGL 2.x,所以我想让事情保持简单=/你不应该研究SDK的实现。你需要做的一切都可以在OVR_CAPI.h头(纯C)中找到,使用
configureRendering()
beginrame()
endFrame()
是的,我的一个mitake。我每天都在学习一些新的东西,并监督这些东西。还有很多其他的东西是错误的,比如纹理坐标,它们必须首先转换,在我的方法中,我必须迭代索引,而不是顶点。我正在重写我的代码,以使用元素数组,这将使从meshData结构中提取数据更容易。