gpt4 book ai didi

c++ - 尝试旋转此立方体时,为什么屏幕闪烁?

转载 作者:行者123 更新时间:2023-11-30 01:43:07 25 4
gpt4 key购买 nike

#include <iostream>
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>
#include <stdio.h>
#include <OpenGL/gl.h>
#include <string.h>
using namespace std;


//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;


bool SetOpenGLAttributes()
{

// SDL_GL_CONTEXT_CORE gives us only the newer version, deprecated functions are disabled
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);


SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

return true;
}



int main( int argc, char* args[] )
{

SDL_Window* window = NULL;

//Initialize SDL
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
}
else
{
//Create window
window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL );
if( window == NULL )
{
printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
}
else
{



//creating new context
SDL_GL_CreateContext(window);

SetOpenGLAttributes();
SDL_GL_SetSwapInterval(1);

//cube front
glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-.5, .5, -.5);
glVertex3f(.5, .5, -.5);
glVertex3f(.5, -.5, -.5);
glVertex3f(-.5, -.5, -.5);
glEnd();

//cube top
glBegin(GL_POLYGON);
glColor3f(1.0,0.0,0.0);
glVertex3f(-.5,.5,-.5);
glVertex3f(.5, .5, -.5);
glVertex3f(.5, .5, .5);
glVertex3f(-.5, .5, .5);
glEnd();

//cube bottom
glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-.5,-.5,-.5);
glVertex3f(.5, -.5, -.5);
glVertex3f(.5, -.5, .5);
glVertex3f(-.5, -.5, .5);
glEnd();

//cube right
glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(.5, -.5, -.5);
glVertex3f(.5, -.5, .5);
glVertex3f(.5, .5, .5);
glVertex3f(.5, .5, -.5);
glEnd();

//cube left
glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-.5, -.5, -.5);
glVertex3f(-.5, .5, -.5);
glVertex3f(-.5, .5, .5);
glVertex3f(-.5, -.5, .5);
glEnd();

//cube back
glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-.5, .5, .5);
glVertex3f(-.5, -.5, .5);
glVertex3f(.5, -.5, .5);
glVertex3f(.5, .5, .5);
glEnd();

glFlush();

SDL_GL_SwapWindow(window);

bool running = true;
while(running){
glRotatef(1, 1, 0, 0);
glFlush();
SDL_GL_SwapWindow(window);
SDL_Delay(100);

}


}
}


//Destroy window
//SDL_DestroyWindow( window );

//Quit SDL subsystems
//SDL_Quit();

return 0;
}

我正在学习openGL和SDL。我设法使这个“立方体”显示出来,但是它看起来像一个红色的矩形。我想旋转多维数据集以确保我的代码实际上是在创建一个多维数据集,但是当我旋转然后交换窗口时,多维数据集只会闪烁。似乎第二个缓冲区窗口只是黑色,但是当再次切换时,它始终是相同的红色矩形。为什么我不能旋转我的立方体,为什么我的第二个缓冲窗口是黑色的?

最佳答案

您不能只绘制图像,然后继续调用rotate,并期望它旋转您先前渲染的所有内容。那不是它的工作原理。可以使OpenGL那样工作,但事实并非如此。

在渲染当前正在绘制的零件之前,需要调用转换函数(旋转,缩放,平移);对于多对象场景(想想2个以上的多维数据集都位于不同的位置,并且彼此独立地移动/旋转),您将重置-变换-绘制-变换-绘制等。可以认为它好像在移动画笔,而不是在移动与您照相的相机。

因此,您应该继续在每个帧(在循环内)重新绘制该形状,并且通常应该在渲染之前将 View 重置为每个帧的单位矩阵(如果愿意的话可以推入/弹出矩阵)。

main loop:
reset view
render
swap buffers

至于双缓冲...

无论何时绘制,都将绘制到缓冲区。您不会同时使用两个缓冲区,一次只能绘制一个缓冲区。如果您使用的是双倍(或更多)缓冲,则在完全渲染完图像后交换缓冲区。您正在绘制的图像被交换到管道中以显示在监视器上,而以前在监视器上显示的图像现在是您下一帧图像的绘制空间。现在就画一个(可能在画之前先擦除它上的所有东西,这是 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);的目的),当完成画下一帧时,您可以再次交换它们。那就是您正在(或应该做)循环的过程。您一次只能绘制一张图像,但是您一直在绘制,交换(以绘制另一幅图像),绘制,交换,绘制,交换等。

至于重置矩阵,请尝试 glLoadIdentity();。查看有关 glLoadIdentity和矩阵模式 here的问题,以供进一步阅读。在这里的特定实例中,只需在每个循环的开始处调用 glLoadIdentity就足够了,但是如果您打算进一步研究该主题,则应该了解投影模式。

至于在您的情况下使用 glLoadIdentity,还记得我说过您应该继续旋转循环的每个实例,每个帧吗?请记住,循环的每次迭代通常都按照您希望其在动画的该帧中的外观绘制图像。在帧之间,您实际上是要重置以绘制新图片,即下一帧。想像 glLoadIdentity就像艺术家将手重新拉回到自己身上一样。如果您不断旋转每一帧,它就会不断旋转。与缩放和平移相同。现在,我考虑了一下,对于您的特定情况,您实际上可能会想要,但通常您不想要。例如,如果您继续进行平移到(1,2,0)并旋转(0.5,0.5,0),则“画笔”将保持移动和旋转每一帧,而您得到的结果很少期待着。

关于“重置”事物的另一个说明:有时您可能还需要在绘画的中间进行“重置”。例如,绘制两个彼此无关的对象,在绘制第一个对象之后,您可以 glLoadIdentity重置内容,以便在绘制第二个对象之前“先将画笔重新握在面前”。相同的缓冲区。或者,如果需要一种效果,无论距离多远,一个对象总是绘制在另一个对象之上,则可以使用 glClear重设深度缓冲区。

查看旋转立方体 here的这个特定示例。

下面的示例的片段-注意它是如何以“重置 View ”类型的代码开始的(有时您将需要更多,具体取决于您的操作),然后进行转换(包括几次旋转),然后进行渲染,然后增加一个变量,该变量保存绘制旋转所使用的立方体的 Angular 。

还要注意,在示例中,代码片段只是函数的主体,但这可以是在主循环中调用的函数,或者该函数的主体可以直接用作循环的主体。
// Clear Screen And Depth Buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Reset The Current Modelview Matrix
glLoadIdentity();

glTranslatef(0.0f, 0.0f,-7.0f); // Translate Into The Screen 7.0 Units
glRotatef(rotqube,0.0f,1.0f,0.0f); // Rotate The cube around the Y axis
glRotatef(rotqube,1.0f,1.0f,1.0f);
glBegin(GL_QUADS); // Draw The Cube Using quads
glColor3f(0.0f,1.0f,0.0f); // Color Blue
glVertex3f( 1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Top)
glVertex3f(-1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Top)
glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Quad (Top)
glVertex3f( 1.0f, 1.0f, 1.0f); // Bottom Right Of The Quad (Top)
glColor3f(1.0f,0.5f,0.0f); // Color Orange
glVertex3f( 1.0f,-1.0f, 1.0f); // Top Right Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f, 1.0f); // Top Left Of The Quad (Bottom)
glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Bottom)
glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Bottom)
glColor3f(1.0f,0.0f,0.0f); // Color Red
glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Front)
glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Front)
glVertex3f(-1.0f,-1.0f, 1.0f); // Bottom Left Of The Quad (Front)
glVertex3f( 1.0f,-1.0f, 1.0f); // Bottom Right Of The Quad (Front)
glColor3f(1.0f,1.0f,0.0f); // Color Yellow
glVertex3f( 1.0f,-1.0f,-1.0f); // Top Right Of The Quad (Back)
glVertex3f(-1.0f,-1.0f,-1.0f); // Top Left Of The Quad (Back)
glVertex3f(-1.0f, 1.0f,-1.0f); // Bottom Left Of The Quad (Back)
glVertex3f( 1.0f, 1.0f,-1.0f); // Bottom Right Of The Quad (Back)
glColor3f(0.0f,0.0f,1.0f); // Color Blue
glVertex3f(-1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Left)
glVertex3f(-1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Left)
glVertex3f(-1.0f,-1.0f, 1.0f); // Bottom Right Of The Quad (Left)
glColor3f(1.0f,0.0f,1.0f); // Color Violet
glVertex3f( 1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Right)
glVertex3f( 1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Right)
glVertex3f( 1.0f,-1.0f, 1.0f); // Bottom Left Of The Quad (Right)
glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Right)
glEnd(); // End Drawing The Cube

rotqube +=0.9f; // Increase Angle

关于c++ - 尝试旋转此立方体时,为什么屏幕闪烁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38334441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com