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++ wxWidgets OpenGl着色器,无法绘制任何内容_C++_Opengl_Wxwidgets - Fatal编程技术网

C++ wxWidgets OpenGl着色器,无法绘制任何内容

C++ wxWidgets OpenGl着色器,无法绘制任何内容,c++,opengl,wxwidgets,C++,Opengl,Wxwidgets,我一直在尝试将着色器和OpenGl合并到wxWidgets程序中。我使用了以下链接: 现在,我已经在一个测试程序中尝试使用Lighthouse 3D教程提供的着色器并重新创建输出(一个蓝色茶壶在白色背景上缓慢旋转)。我似乎什么也画不出来,我只能看到一个黑屏。到目前为止,我的代码如下(我将忽略大部分着色器,因为我99%确定它们是好的): 但我非常希望避免使用过剩,并且一直到现在都在设法避免。我之前添加它的唯一原因是尝试复制教程的行为 编辑: 我要补充一点,因为我已经注意到一两个奇怪的行为。如果

我一直在尝试将着色器和OpenGl合并到wxWidgets程序中。我使用了以下链接:

现在,我已经在一个测试程序中尝试使用Lighthouse 3D教程提供的着色器并重新创建输出(一个蓝色茶壶在白色背景上缓慢旋转)。我似乎什么也画不出来,我只能看到一个黑屏。到目前为止,我的代码如下(我将忽略大部分着色器,因为我99%确定它们是好的):

但我非常希望避免使用过剩,并且一直到现在都在设法避免。我之前添加它的唯一原因是尝试复制教程的行为

编辑:

我要补充一点,因为我已经注意到一两个奇怪的行为。如果我在绘图中调用此函数:

void BasicGLPane::prepare2DViewport(int topleft_x, int topleft_y, int bottomrigth_x, int bottomrigth_y)
{
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // Black Background
    glEnable(GL_TEXTURE_2D);   // textures
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

    glViewport(topleft_x, topleft_y, bottomrigth_x-topleft_x, bottomrigth_y-topleft_y);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluOrtho2D(topleft_x, bottomrigth_x, bottomrigth_y, topleft_y);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

当我改变窗口大小时,我可以让背景改变颜色。我还应该提到,它并不是刷新每一帧,它只绘制一帧,然后在我更改窗口大小之前不会再次调用渲染函数。

到目前为止,您的代码看起来不错。在很多教程中,你会发现一件事,但不好的做法是,显然有一些初始化正在发生。事实并非如此。OpenGL并没有初始化,它是一个状态机,您应该在需要时设置状态。台词

glEnable(GL_DEPTH_TEST);
glClearColor(1.0,1.0,1.0,1.0);
glEnable(GL_CULL_FACE);
我们在绘图功能方面非常满意。您还需要设置投影。在教程中,您经常会发现它们是在窗口调整大小处理程序中设置的。请不要养成这个坏习惯。投影和视口是绘图状态,因此在绘图功能中设置它们


如果您使用的是OpenGL-3(core profile)或更高版本,则必须至少提供一个顶点和一个片段着色器。在旧版本中,每个着色器阶段都是可选的,并且有内置变量,为固定功能和可编程管道之间的通信提供公共基础。不过,我强烈建议不要混业经营。始终使用着色器并同时使用顶点和片段着色器。从长远来看,它们使事情变得更加容易。

结果表明,我不需要在渲染中使用gluLookAt。

好的,我尝试添加frag着色器,但没有成功。你提到的行,我没有使用,我没有使用代码块中的任何一行。我稍微编辑了这个问题,这可能会提供更多信息。@ravenpoint我删除/编辑了一些位,但主要的问题是,当我复制了这些教程的部分内容时,无法获得任何输出。我试图提供尽可能多的信息,说明我认为可能的原因,但我没有一个强有力的/潜在的想法,因此我提到了我认为可能出现问题的多个地方。我不是想把它说成是多个问题,我所说的输出不是指黑屏。
void BasicGLPane::prepare2DViewport(int topleft_x, int topleft_y, int bottomrigth_x, int bottomrigth_y)
{
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // Black Background
    glEnable(GL_TEXTURE_2D);   // textures
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

    glViewport(topleft_x, topleft_y, bottomrigth_x-topleft_x, bottomrigth_y-topleft_y);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluOrtho2D(topleft_x, bottomrigth_x, bottomrigth_y, topleft_y);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
glEnable(GL_DEPTH_TEST);
glClearColor(1.0,1.0,1.0,1.0);
glEnable(GL_CULL_FACE);