小编Inv*_*lid的帖子

虚拟继承,足够一个类?

我理解虚拟继承的概念,但我无法在任何地方找到答案.假设您有继承B类和C类的D类.B和C都继承A类.所以你可以让B和C虚拟继承A以避免A的两个实例.但是你必须在B和C都指定虚拟继承吗?或者,如果两个中的一个实际上继承了A而另一个没有,那么它是否只创建了一个A实例?

谢谢

c++ multiple-inheritance virtual-inheritance

10
推荐指数
2
解决办法
726
查看次数

OpenGL非常特定于机器

最近我开始在C++中使用OpenGL进行一些3D渲染,但奇怪的是它似乎只适用于几台机器.我正在使用OpenGL 3.0或更高版本(目前设置为3.0)使用顶点数组对象(不确定它是如何被调用的,但API修订版删除了glBegin,glEnd等).

在另一台机器上测试之前,我总是要求他们的GPU驱动程序,大多数都支持OpenGL 4.2,如果没有,我确保它们至少支持3.0.然而在某些机器上我的应用程序只是崩溃,或者没有渲染任何东西,OpenGL不会抛出任何错误(我每帧至少检查一次错误).虽然它在我自己的机器上工作得很好,但在某些情况下,我的机器甚至比某些机器上的机器还要老.

我开始只使用OpenGL本身和GLEW,但为了易于使用和我喜欢的其他一些功能切换到SFML和GLEW,OpenGL本身并没有改变它的行为.我确实重写了我正在处理的引擎来封装所有GL调用并合并顶点数组对象和其他一些功能,实际上我可以给你一个应用程序使用的所有API调用的列表.显然它并没有在测试应用程序中使用它们,但这些都是我在引擎中使用的所有调用(这是最小的能够渲染,所以是的,引擎甚至没有接近完成):

  • glAttachShader
  • glBindAttribLocation
  • glBindBuffer
  • glBindVertexArray
  • glBufferData
  • glBufferSubData
  • glClear
  • glClearColor
  • glClearDepth
  • glCompileShader
  • glCreateProgram
  • glCreateShader
  • glCullFace
  • glDeleteBuffers
  • glDeleteProgram
  • glDeleteShader
  • glDeleteVertexArrays
  • glDepthFunc
  • glDepthMask
  • glDepthRange
  • glDisableVertexAttribArray
  • glDrawElements
  • glEnable
  • glEnableVertexAttribArray
  • glFrontFace
  • glGenBuffers
  • glGenVertexArrays
  • glGetAttribLocation
  • glGetBufferParameteriv
  • glGetBufferSubData
  • glGetError
  • glGetIntegerv
  • glGetProgramInfoLog
  • glGetProgramiv
  • glGetShaderInfoLog
  • glGetShaderiv
  • glGetShaderSource
  • glGetUniformLocation
  • glIsProgram
  • glIsShader
  • glLinkProgram
  • glMapBufferRange
  • glPixelStorei
  • glShaderSource
  • glUniform(1i,1ui,1f,2f,3f,4f,Matrix3fv,Matrix4fv)
  • glUnmapBuffer
  • glUseProgram
  • glVertexAttrib(1i,1ui,1f,2f,3f,4f)
  • glVertexAttribPointer

简而言之,Shader和ShaderProgram部分没有什么特别之处,我有一些方法可以创建/编译它们,事先设置一些属性位置,最后设置属性/制服.缓冲区对象也没有什么特别之处,你可以编写,读取和映射缓冲区,目前我只使用GL_ARRAY_BUFFER和GL_ELEMENT_ARRAY_BUFFER.最后我使用顶点数组对象实际渲染对象,显然我设置了属性指针,封装了绘制调用和程序用法,它总是使用索引绘图.

此外,我广泛搜索谷歌和堆栈溢出本身的答案.但是所有问题都与OpenGL无法在任何地方工作有关,例如,某些API调用未按顺序调用或根本不调用.遗憾的是,这些答案都不适用于我,它一直在我自己的机器和我可以直接访问的其他机器上工作,但是当我将应用程序发送给其他人在他们的机器上进行测试时,它从未起作用.

希望这是特定的XD

编辑,从下面的帖子复制

每个测试都在windows vista或7上完成.我已经对每个API调用进行了OpenGL错误检查,似乎没有任何错误.我无法在自己的机器上重现它,但在其他机器上进行了一些跟踪后,我发现它不会崩溃直到渲染.设置工作正常,它可以很好地创建所有缓冲区和对象,但是一旦我尝试渲染网格(VAO),它就会崩溃而没有任何错误(除了.exe已停止工作).我怀疑glUseProgram或glDrawElements命令

关于一个例子,除非你想搜索大约10个类,否则我不能给你一个简短的例子

编辑,渲染对象的微小代码

Mesh类将这些结构添加到对象中,因此它知道要绘制的内容:

// Define Geometry (draw command)
struct Geometry
{
    // Primitives
    PrimitiveType primitiveType;

    // Indices
    IndexType …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glew render sfml

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

glBlitFramebuffer无效操作

我一直在搞乱框架缓冲区并渲染到纹理,我遇到了blit它们的需要.在某些机器上,我GL_INVALID_OPERATIONglBlitFramebuffer通话结束后立即得到了一个.绑定到帧缓冲区的每个纹理都以完全相同的方式设置,所有相同的大小和参数.此外,当我尝试将一个完整的纹理(先前成功渲染到)另一个帧缓冲区blit时,只有要写入的目标"矩形"小于要读取的矩形(例如,当我想将其渲染到四分之一时屏幕),它也抛出一个GL_INVALID_OPERATION.

编辑: 实际上它总是抛出错误,每当矩形读取和绘制具有不同的大小,所以我不能blit到不同大小的纹理,或相同的大小,但不同大小的"渲染到"区域. ..?

每次我对手动生成的帧缓冲区进行blit时都会检查状态,glCheckFramebufferStatus并且它总是返回GL_FRAMEBUFFER_COMPLETE.

-BIGGEST SNIP EVER-,请参阅下面的更短'源代码',显然有几个C++错误而且不完整,但它仅适用于GL调用

当我使用屏幕帧缓冲区作为目标(通过传递NULL)调用视口的最后一个方法(Viewport :: blit)时,会发生OpenGL错误.它首先设置自己的帧缓冲区的读缓冲区(已经设置了绘制缓冲区)然后调用RenderTarget :: blit调用它glBlitFramebuffer.在blit方法中它绑定两个缓冲区,你可以看到它调用glCheckFramebufferStatus那里不会返回错误.

我一直在读这个,但我似乎无法找到导致它的错误.当我使用GL_LINEAR我使用的GL_NEAREST颜色缓冲区时,我使用所有颜色缓冲区GL_RGB32F作为内部格式使用深度缓冲区(我从不blit)使用GL_DEPTH_COMPONENT32F

编辑,一个较短的例子,刚刚接受了所有GL调用并填写了我使用的参数

glBindFramebuffer(GL_READ_FRAMEBUFFER, _GL_Framebuffer);
glReadBuffer(GL_COLOR_ATTACHMENT0 + index);
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);

// OpenGL error check, does not return an error

glBindFramebuffer(GL_READ_FRAMEBUFFER, _GL_Framebuffer);
GLenum status = glCheckFramebufferStatus(GL_READ_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE)
{
    // Some error checking, fortunately status always turns out to be complete
}
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

glBlitFramebuffer(0, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl render blit

6
推荐指数
1
解决办法
4308
查看次数