gpt4 book ai didi

c - sdl_gl_setattribute 上的 sdl 应用程序段错误

转载 作者:太空宇宙 更新时间:2023-11-04 05:00:29 34 4
gpt4 key购买 nike

我正在尝试编译这个 example并尝试一下。我已经纠正了人们在此示例中遇到的主要错误,他们会在调用 SDL_Init 之前调用 sdl_gl_setattribute,但在第一次 SDL_GL_SetAttribute 调用之后我仍然遇到段错误。我之前在我的电脑上用 opengl 应用程序运行过 sdl,我确信它一直在我的视频卡上工作。

从这段代码中有人知道它为什么会出现段错误吗?或者,此代码是否可以在其他任何人的计算机上运行?如果它有什么不同,我在 ubuntu 10.04 上使用 freeglut3 来处理 opengl 的东西。

//compile with cc triangle.c -o triangle `sdl-config --libs --cflags` -lglut

#include <stdio.h>
#include "SDL.h"
#include <GL/gl.h>

int event_thread(void* nothing);

int main(int argc, char** argv) {
float theta = 0.0f;

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTTHREAD);

//first set buffer stuff, then doublebuf (if wanted), then SDL_SetVideoMode()
if(SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8) < 0) { printf("opengl error: %s\n", SDL_GetError()); }
if(SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8) < 0) { printf("opengl error: %s\n", SDL_GetError()); }
if(SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8) < 0) { printf("opengl error: %s\n", SDL_GetError()); }
if(SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32) < 0) { printf("opengl error: %s\n", SDL_GetError()); }
if(SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1) < 0) { printf("couldn't set double buffering: %s\n", SDL_GetError()); }

//go through and get the values to see if everything was set
int red, green, blue, doublebuf;
SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &red);
SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &green);
SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &blue);
SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &doublebuf);
printf("red size, green size, blue size: <%d, %d, %d>\ndouble buffered? %s\n", red, green, blue, (doublebuf == 1 ? "yes" : "no"));

//pass sdl_resizable if it's an opengl application that is windowed and not fullscreened
SDL_Surface* screen = SDL_SetVideoMode(600, 300, 32, SDL_OPENGL | SDL_HWSURFACE | SDL_NOFRAME | SDL_RESIZABLE);
if(screen == NULL) {
printf("video error: %s\n", SDL_GetError());
}

//print video card memory
const SDL_VideoInfo* info = SDL_GetVideoInfo();
printf("video card memory (in megabytes): %d\n", info->video_mem);

//set opengl params for drawing in 3d space
glViewport(0, 0, 600, 300);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_PROJECTION);
glMatrixMode(GL_MODELVIEW);

//start up the event thread
int done = 0;
SDL_Thread* evt_thrd;
evt_thrd = SDL_CreateThread(event_thread, (void*)&done);

for(;!done;) {
//clear and move to 0, 0, 0
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(0.0f, 0.0f, 0.0f);
glRotatef(theta, 0.0f, 0.0f, 1.0f);

//draw the triangle
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(0.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex2f(0.87f, -0.5f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex2f(-0.87f, -0.5f);
glEnd();

theta += 0.5f;
SDL_GL_SwapBuffers();
}

SDL_Quit();
return 0;
}

int event_thread(void* nothing) {
int* done = (int*)nothing;
SDL_Event event;

while(1) {
while(SDL_PollEvent(&event)) {
if(event.type == SDL_QUIT ||
(event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)) {
*done = 1;
return 0;
}
}
}
}

最佳答案

试试这个版本:

//compile with cc triangle.c -o triangle `sdl-config --libs --cflags` -lglut

#include <stdio.h>
#include "SDL.h"
#include "SDL_opengl.h"

int event_thread(void* nothing);

int main(int argc, char** argv) {
float theta = 0.0f;

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTTHREAD);

//first set buffer stuff, then doublebuf (if wanted), then SDL_SetVideoMode()
if(SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8) < 0) { printf("opengl error: %s\n", SDL_GetError()); }
if(SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8) < 0) { printf("opengl error: %s\n", SDL_GetError()); }
if(SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8) < 0) { printf("opengl error: %s\n", SDL_GetError()); }
if(SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32) < 0) { printf("opengl error: %s\n", SDL_GetError()); }
if(SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1) < 0) { printf("couldn't set double buffering: %s\n", SDL_GetError()); }

//pass sdl_resizable if it's an opengl application that is windowed and not fullscreened
SDL_Surface* screen = SDL_SetVideoMode(600, 300, 32, SDL_OPENGL | SDL_HWSURFACE | SDL_NOFRAME | SDL_RESIZABLE);
if(screen == NULL) {
printf("video error: %s\n", SDL_GetError());
}

//go through and get the values to see if everything was set
int red, green, blue, doublebuf;
SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &red);
SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &green);
SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &blue);
SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &doublebuf);
printf("red size, green size, blue size: <%d, %d, %d>\ndouble buffered? %s\n", red, green, blue, (doublebuf == 1 ? "yes" : "no"));

//print video card memory
const SDL_VideoInfo* info = SDL_GetVideoInfo();
printf("video card memory (in megabytes): %d\n", info->video_mem);

//set opengl params for drawing in 3d space
glViewport(0, 0, 600, 300);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_PROJECTION);
glMatrixMode(GL_MODELVIEW);

//start up the event thread
int done = 0;
SDL_Thread* evt_thrd;
evt_thrd = SDL_CreateThread(event_thread, (void*)&done);

for(;!done;) {
//clear and move to 0, 0, 0
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(0.0f, 0.0f, 0.0f);
glRotatef(theta, 0.0f, 0.0f, 1.0f);

//draw the triangle
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(0.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex2f(0.87f, -0.5f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex2f(-0.87f, -0.5f);
glEnd();

theta += 0.5f;
SDL_GL_SwapBuffers();
}

SDL_Quit();
return 0;
}

int event_thread(void* nothing) {
int* done = (int*)nothing;
SDL_Event event;

while(1) {
while(SDL_PollEvent(&event)) {
if(event.type == SDL_QUIT ||
(event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)) {
*done = 1;
return 0;
}
}
}
}

关于c - sdl_gl_setattribute 上的 sdl 应用程序段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3898441/

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