gpt4 book ai didi

c++ - OpenGL:没有绘制

转载 作者:行者123 更新时间:2023-11-28 07:49:05 26 4
gpt4 key购买 nike

图形:AMD Radeon HD 7900 系列

运行:Windows 7(64 位)

程序:CodeBlocks(32 位)

OpenGL 库:GLee

这是我设置窗口的地方。它是一个使用 OpenGL 渲染的 SDL 窗口。

void Init(int w, int h, bool fullScr)
{
if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
printf("Unable to initialize SDL: %s\n", SDL_GetError());
}
winW = w*scale;
winH = h*scale;
original_winW = w;
origianl_winH = h;

putenv("SDL_VIDEO_WINDOW_POS");
putenv("SDL_VIDEO_CENTERED=1");

getenv("SDL_VIDEO_WINDOW_POS");
getenv("SDL_VIDEO_CENTERED");

SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); // *new*
SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 0 ); // *new*

//Sets up the screen and displays the window
screen = SDL_SetVideoMode( winW, winH, 32, SDL_OPENGL | (fullScr*SDL_FULLSCREEN) ); // *changed*
screenRect.x = 0;
screenRect.y = 0;
screenRect.w = winW;
screenRect.h = winH;

SDL_ShowCursor(false);

SetGLState();
}

这就是上面提到的 SetGLState()。

void SetGLState(){
glEnable( GL_TEXTURE_2D ); //Enable 2d texturing

glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); //Set clear color (rgba)

glViewport( 0, 0, winW, winH ); //Set the viewport

glClear( GL_COLOR_BUFFER_BIT ); //Clear back buffer?

glMatrixMode( GL_PROJECTION ); //Set to projection
glLoadIdentity();

glOrtho(0.0f, winW, winH, 0.0f, -1.0f, 1.0f); //Create orthogonal projection matrix

glMatrixMode( GL_MODELVIEW ); //Set back to model view
glLoadIdentity();

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

这是将图像绘制到屏幕的地方

void DrawImage(GLSurface image, float x, float y)
{
// Bind the texture to which subsequent calls refer to
if(boundTexture != image.Surface){glBindTexture( GL_TEXTURE_2D, image.Surface ); boundTexture = image.Surface; }

glReadPixels(x,y,image.w*2,image.h*2,GL_UNSIGNED_BYTE,NULL,NULL);

glLoadIdentity();
glScalef(scale,scale,1);

glRotatef(image.rotation[0], 1.0f, 0.0f, 0.0f);
glRotatef(image.rotation[1], 0.0f, 1.0f, 0.0f);
glRotatef(image.rotation[2], 0.0f, 0.0f, 1.0f);

if(scale == 7.5)x += 48;

glBegin( GL_QUADS );
//Bottom-left vertex (corner)
glColor3b(127,127,127);
glTexCoord2i( 0, 0 ); //Position on texture to begin interpolation
glVertex3f( x, y, 0.f ); //Vertex Coords

//Bottom-right vertex (corner)
glTexCoord2i( 1, 0 );
glVertex3f( x+image.w, y, 0.f );

//Top-right vertex (corner)
glTexCoord2i( 1, 1 );
glVertex3f( x+image.w, y+image.h, 0.f );

//Top-left vertex (corner)
glTexCoord2i( 0, 1 );
glVertex3f( x, y+image.h, 0.f );
glEnd();
}

这个窗口没有绘制任何东西,我不明白为什么。我已经有一段时间没有看过这段代码了,但我知道在之前安装的 Windows 中,我已经让它工作了。我的所有其他项目都在运行,但这个项目没有。它只是呈现一个空白屏幕。奇怪的是——我有一个调整这个窗口大小的功能。调用该函数时,屏幕显示白色屏幕而不是黑色屏幕。

编辑**一旦所有东西都被绘制到屏幕上,这段代码就会在最后被调用。它已经包含在我的代码中。

void Flip(){
SDL_GL_SwapBuffers();
glClear( GL_COLOR_BUFFER_BIT );
}

最佳答案

SetGLState中设置的所有状态都是绘图状态。从 DrawImage 函数调用它。最重要的是,glClear 必须放在 draw 函数中,它在其他任何地方都没有意义。

glReadPixels 的调用毫无意义。

完成后必须交换缓冲区 SDL_SwapBuffers(IIRC,有一段时间没有使用 SDL)。

关于c++ - OpenGL:没有绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14230875/

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