小编jsh*_*hxe的帖子

现代OpenGL阴影立方体贴图上的指针?

背景

我正在使用C++和现代OpenGL(3.3)开发3D游戏.我现在正致力于光照和阴影渲染,并且我已经成功实现了方向阴影贴图.在阅读了游戏要求后,我决定要点光影映射.在做了一些研究之后,我发现要做全向阴影贴图,我会做类似于定向阴影贴图的事情,但是使用立方体贴图.

我以前没有立方体贴图的知识,但我对它们的理解是立方体贴图是六个纹理,无缝连接.我做了一些环顾四周但不幸的是我很难找到关于现代OpenGL主题的权威"教程".我首先寻找教程,从头到尾解释它,因为我认真地努力学习源代码片段或概念,但我尝试过.

目前的理解

以下是我对这个想法的一般理解,减去技术性.请指正.

  • 对于每个点光源,都会设置帧缓冲,就像定向阴影贴图一样
  • 然后生成单个立方体贴图纹理并绑定glBindTexture(GL_TEXTURE_CUBE_MAP, shadowmap).
  • 立方体贴图使用以下属性设置:

    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
    Run Code Online (Sandbox Code Playgroud)

(这也类似于定向阴影贴图)

  • 现在glTexImage2D()迭代六次,每次面部一次.我这样做:

     for (int face = 0; face < 6; face++) // Fill each face of the shadow cubemap
         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_DEPTH_COMPONENT32F , 1024, 1024, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
    
    Run Code Online (Sandbox Code Playgroud)
  • 通过调用将纹理附加到帧缓冲区

    glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, shadowmap, 0);
    
    Run Code Online (Sandbox Code Playgroud)
  • 当要渲染场景时,它将以两个过程渲染,如定向阴影贴图.

  • 首先,绑定阴影帧缓冲区,将视口调整为阴影贴图的大小(在这种情况下为1024×1024).
  • 剔除设置在正面 glCullFace(GL_FRONT)
  • 活动着色器程序切换到顶点和片段阴影着色器,我将提供进一步向下的源
  • 计算所有六个视图的光视图矩阵.我是通过创建glm :: mat4和push_back()矩阵的向量来实现的,如下所示:

    // Create the six view matrices …
    Run Code Online (Sandbox Code Playgroud)

c++ opengl 3d shader shadow-mapping

18
推荐指数
1
解决办法
3447
查看次数

奇数OpenGL阴影映射行为

我正在使用CML和使用SFML的OpenGL 3.2开发3D游戏.我一直在努力实现点光影映射.到目前为止,我所做的似乎符合我所学到的和我见过的例子,但仍然没有阴影.

我所做的是按照我使用它的确切顺序编写一个简单的所有代码列表,但不是完整的源代码,只有相关的代码(因为我的项目分为几个类):

Omnidirectional shadow mapping


C++
- Initialization
-- Use shadow pass shader program
-- Generate + bind the shadow frame buffer
glGenFramebuffers(1, &shadowFrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, shadowFrameBuffer);


-- Generate a texture
glGenTextures(1, &shadowMap);

-- Bind texture as cubemap
glBindTexture(GL_TEXTURE_CUBE_MAP);

-- Set texture parameters
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

-- Generate empty 1024 x 1024 for every face of the cube
for (int face = 0; face < 6; …
Run Code Online (Sandbox Code Playgroud)

c++ opengl shadow-mapping

8
推荐指数
1
解决办法
1325
查看次数

未定义的引用`boost :: chrono :: system_clock :: now()' - Boost和cpp-netlib

我来这里是为了解决令我感到沮丧的情况.很多.首先,我在Windows上,我使用MinGW作为编译器(C++).

我在使用cpp-netlib和SSL(尝试POST到https站点)的程序中遇到了一些问题.我相信一切都井井有条,除了这一个不断躲避我的错误.
C:\boost_1_50_0\boost_1_50_0\stage\lib\libboost_thread-mgw46-mt-1_50.a(thread.o):thread.cpp|| undefined reference to 'boost::chrono::system_clock::now()'

我确信我已经链接到chrono,以及所有的.a libs BOOST_ROOT/stage/lib.我已经尝试重新排序,所以chrono在线程之前被链接.什么都没有帮助.我已经尝试BOOST_CHRONO_INLINED在我的IDE设置和多个conf.hpps中定义它仅使其成为标题,这没有帮助.

我很确定这是一个新手问题,我希望有人能给我一个快速解决方案.我匆匆写了这篇文章,因为我必须在某个地方,但如果你需要更多信息请说出来,我回家后可以更仔细地写.谢谢!

c++ boost boost-thread undefined-reference c++-chrono

7
推荐指数
1
解决办法
6531
查看次数

OpenGL与Haxe C++?

我有兴趣将Haxe转换为我的主要编程语言,到目前为止它已经很棒了,但是我的一个要求是我可以将OpenGL 3.3和C++目标一起用于3D游戏工作.

然而,这似乎是一件奇怪的事情,因为我在网上找到关于在Haxe中使用OpenGL的信息很少.我找到了一些库,特别是hx-ogl和foo3d(抽象的类似ogl),但它们都没有维护,我无法让它们工作.我也发现了一些3D引擎,但我想使用纯OpenGL.此外,我只需要针对C++,因此不需要跨平台性.

有没有人成功使用OpenGL与Haxe C++合作?

c++ opengl haxe hxcpp

5
推荐指数
1
解决办法
4460
查看次数