我想将指向派生类的成员的void*指针转换为基类的指针,如下例所示:
#include <iostream>
class Base
{
public:
void function1(){std::cout<<"1"<<std::endl;}
virtual void function2()=0;
};
class Derived : public Base
{
public:
virtual void function2(){std::cout<<"2"<<std::endl;}
};
int main()
{
Derived d;
void ptr* = static_cast<void*>(&d);
Base* baseptr=static_cast<Base*>(ptr);
baseptr->function1();
baseptr->function2();
}
Run Code Online (Sandbox Code Playgroud)
这将编译并给出了期望的结果(打印1和2分别),但它是保证工作?static_cast我在这里找到的描述:http://en.cppreference.com/w/cpp/language/static_cast
仅提到转换为void*指向同一类的指针(第10点).
以下程序应该:
GLFWwindow* masterWindowmasterWindow GLFWwindow* childWindow,在此窗口的OpenGL上下文和masterWindow上下文之间激活共享childWindow但是,这不起作用,即取代纹理,我得到显示的图形内存的随机片段childWindow.如果我childWindow在加载之前创建当前的上下文,那么显示纹理是有效的,这就是为什么我认为问题既不是我的着色器也不是我的纹理加载例程(我从这里开始,https://github.com/ DavidEGrayson/ahrs-visualizer/blob/master/png_texture.cpp).我明白我应该能够分享纹理(请参阅这个问题的答案:OpenGL - 用未来的上下文分享现有的纹理?),那么我做错了什么?在重要的情况下,我使用2008年末的Macbook,安装了NVIDIA 9400m和Mavericks/OpenGL 3.3.
#include <iostream>
#define GLEW_STATIC
#include <glew.h>
#include <glfw3.h>
const char* vShader =
"#version 150 core\n"
"in vec2 vertex;"
"in vec2 vertexUV;"
"out vec2 UV;"
"void main() {gl_Position = vec4(vertex,0,1);UV=vertexUV;}";
const char* fShader =
"#version 150 core\n"
"uniform sampler2D sampler;"
"in vec2 UV;"
"out vec4 color;"
"void main() {color = texture(sampler, UV);}";
GLuint …Run Code Online (Sandbox Code Playgroud) 假设我为统一缓冲区分配内存,如下所示:
GLuint length(0x1000);
GLuint myBuffer;
glGenBuffers(1, &myBuffer);
glBindBuffer(GL_UNIFORM_BUFFER, myBuffer);
glBufferData(GL_UNIFORM_BUFFER, length, NULL, GL_STATIC_DRAW);
Run Code Online (Sandbox Code Playgroud)
当我使用缓冲区时,我想确保内存再次可用于其他缓冲区.是否足以呼吁glDeleteBuffers(1,&myBuffer)实现这一目标?因为我的直觉告诉我应该有一个对称的调用glBufferData(就像glInvalidateBufferData?在OpenGL 4中一样),但在文档中根本没有提到任何类型的调用glBufferData(http://www.opengl.org/sdk/docs/ man/xhtml/glBufferData.xml)