OpenGL Rendering over SDL

Started by
8 comments, last by dreamslayerx 11 years, 5 months ago
Hey guys. My problem may be pretty simple. I am writing some code for a world. I have it where opengl renders and sdl does everything else. The problem is that SDL wants to render before opengl, and if It doesn't create a screen I can't control my audio sound effect events. Does anyone know how to make SDL no render and give me only audio and controls with opengl doing the rendering thanks.

I will attach the current code of the audio for sdl. The issue is that if I don't have
SDL_Surface *screen;
screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);

uncommented out; I am not able to use my events. Worse it will not let opengl render over SDL.

I will not let me upload the file so here is the code.


[color=#0000cd]/*This program is a test program for using SDL Mixer to create sound in programs
[color=#0000cd]Music and file loading on program works great. I just need to figure out how to control audio effect events without
SDL needing to create a screen.
I also need to put this into a function
Note: The only issue with the program is that I can't controly my audio effect events unless I let SDL create a screen*/
[color=#0000cd]#include <SDL/SDL.h>
#include "SDL_mixer.h" //This include library directory may change on different machines

[color=#0000cd]//SDL sound function
void SDL_Sound()
{
SDL_Init(SDL_INIT_AUDIO);
SDL_Surface *screen; //test
screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE); //test
Mix_Chunk* effect1; //new varible to create effects from SDL lib
Mix_Music* music; //used to create the music
[color=#0000cd]//Open Audio
Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT,2, 4096);//require 4 parameters ( references (default 22050 or 41000), format(how to open,number of channels , chunk size)
[color=#0000cd]//Loading Music
music = Mix_LoadMUS("Train.wav"); //assigns music to load Mix_LoadMUS(filenam. filetype)
[color=#0000cd]//Assiging music to load
effect1=Mix_LoadWAV("TrainHorn.wav");
[color=#0000cd]//Playing the music
Mix_PlayMusic(music,-1);//Telling program to play the music (play music file, how long to play 0 = play once, -1 = repeat, 1 = will repeat once)

[color=#0000cd]//now to control the effect when key is pressed
bool running=true; //boolean expression to make true
Uint32 start;
//SDL_Event event;
while(running)
{

start=SDL_GetTicks();
SDL_Event event;
while(SDL_PollEvent(&event))
{
[color=#0000cd] switch(event.type)
{
case SDL_QUIT:
running=false;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
[color=#0000cd] case SDLK_1: //number key 1 can be pressed
Mix_PlayChannel(-1, effect1, 0);// there are a total of 8 channels (channel, effect to play, how to repeat)
break;
case SDLK_2: //number key 1 can be pressed
running = false;
break;
}
}
}
[color=#0000cd]};
[color=#0000cd]Mix_FreeChunk(effect1);
Mix_FreeMusic(music);
}


[color=#0000cd]int main(int argc,char** argv)
{

[color=#0000cd]SDL_Sound();


[color=#0000cd]//Closing Audio
Mix_CloseAudio();
SDL_Quit();
return 0;
}
Advertisement
When you say that OpenGL renders, do you mean that you are creating another window via some other means? Why don't you just use SDL_SetVideoMode(640,480,32,SDL_OPENGL) to create your GL window, and still have access to the SDL events and Mixer?
I have a little listing for you

[source]
#include "SDL/SDL.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <unistd.h>
#define CHECK_IT(A) \
if((A)) { \
SDL_Quit(); \
return 1; \
}
void SetupGL() {
int nRange = 10;
int w = 640, h = 480;
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glShadeModel(GL_FLAT);
glViewport(0, 0, 640, 480); // set size of frame for opengl to build perspective
glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);
// glMatrixMode(GL_PROJECTION);
//glLoadIdentity();
gluPerspective(45.0f, w/h, 0.0f, 500.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void Draw() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_CULL_FACE | GL_DEPTH_TEST);
glPushMatrix();

glBegin(GL_TRIANGLE_STRIP);
{
//glTranslatef(0.0, 0.0, 10.0);
glColor3f(0.5f, 0.5f, 0.0f);
glVertex2f(0.0f, 0.0f);
glVertex2f(-10.0f, 0.0f);
glVertex2f(0.0f, -10.0f);
glVertex2f(-10.0f, -10.0f);
}
glEnd();
glBegin(GL_TRIANGLE_STRIP);
{
glColor3f(0.0, 0.5, 0.5);
glVertex2f(0.0f, 0.0f);
glVertex2f(10.0f, 0.0f);
glVertex2f(0.0f, 10.0f);
glVertex2f(10.0f, 10.0f);
glTranslatef(10.0, 0.0, 0.0);
}
glEnd();
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
SDL_GL_SwapBuffers();
}
int main() {
int result = SDL_Init(SDL_INIT_VIDEO);
CHECK_IT(result < 0);
SDL_SetVideoMode(640, 480, 16, SDL_OPENGL); // here you set openGL using for render inframe stuff
SetupGL();
Draw();
sleep(3);
SDL_Quit();
return 0;
}
[/source]

I pretty sure this code has few mistakes but it still showing how to link sdl and opengl.
C x 2 C x o C x C f nice C x C s C x C c
Here are the windows that I am getting. I have attached them a a file. I only want the opengl window, but I don't need the SDL App window to come up. The big issue is will I have to put my OpenGL rendering within the while(running = true) loop to just get it to render with the sound? I only want OpenGL to do rendering, but SDL to control sound and events. Is that possible? Currently the only thing that I want from SDL is Audio, but it wants to control video or a screen as well, even though I only use SDL_Init(SDL_INIT_AUDIO).

I have already actually tried inputing SDL_SetVideoMode(640,480,32,SDL_OPENGL). SDL still wants to render a screen if I want to control my sound effect events.

Here is the adjusted code for the main section of the program. I decided to move the sound function into the main program. There may be a better way of doing this though.

SDL and glut conflicts, since they like to control the same things. Basically here SDL events can not even be controlled at all unless you first do SDL_SetVideoMode().

[source lang="java"]int main(int argc, char ** argv)
{
//SDL_Init(SDL_INIT_AUDIO);


//Real program
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE| GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("colorcube");

//Function that makes display list for the Terrain
loadTerrain(); //Original Code
//function added in to make display list for Geometry
makeGeometry();

cout<<endl;
cout<<" Elevation[1] : " <<Elevation[1]<<endl;


//Place initialization function here
initRendering();


//SOUND TESTING NEW
// SDL_Sound();
//*********************************************************Big test: Delete all later**************************************************************

SDL_Init(SDL_INIT_AUDIO);
SDL_Surface *screen; //test
screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL); //test
Mix_Chunk* effect1; //new varible to create effects from SDL lib
Mix_Music* music; //used to create the music

//Open Audio
Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT,2, 4096);//require 4 parameters ( references (default 22050 or 41000), format(how to open,number of channels , chunk size)

//Loading Music
music = Mix_LoadMUS("Train.wav"); //assigns music to load Mix_LoadMUS(filenam. filetype)

//Assiging music to load
effect1=Mix_LoadWAV("TrainHorn.wav");

//Playing the music
Mix_PlayMusic(music,-1);//Telling program to play the music (play music file, how long to play 0 = play once, -1 = repeat, 1 = will repeat once)


//now to control the effect when key is pressed
bool running=true; //boolean expression to make true
Uint32 start;
SDL_Event event;

while(running)
{
start=SDL_GetTicks();
SDL_Event event;
while(SDL_PollEvent(&event))
{

switch(event.type)
{
case SDL_QUIT:
running=false;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{

case SDLK_1: //number key 1 can be pressed
Mix_PlayChannel(-1, effect1, 0);// there are a total of 8 channels (channel, effect to play, how to repeat)
break;
case SDLK_2: //number key 1 can be pressed
running = false;
break;
}
}
glutReshapeFunc(myReshape);
glutDisplayFunc(display);

//glutIdleFunc(spinCube);
glutMouseFunc(mouse);
glutMainLoop(); //
}

};
//**************************************************************************************************************************************************

//Section for deleting variable arrays to free up memory
//These may be properly placed later; like in a new load clear function when putting in multiple geometry
//Note** If I do not use display list to store the image and these are placed before the main loop the image will not show, since the stored data would be deleted on the second loop of main
//This will be used to free up the memory so that I can read in another object using a function
delete [] vertices;
delete [] vertNorm;
delete [] vertCoord;
delete [] makePoint;
delete [] texPoint;
delete [] VNormPoint; //Original
//glutMainLoop(); // anything placed after this will really not be read since it makes main loop until it comes back to this function then repeats
//********************SOUND TEST AREA 2*******************************************************************


//Deleteing variables recently created
//Mix_FreeChunk(effect1);
//Mix_FreeMusic(music);

//Closing Audio
Mix_CloseAudio();
SDL_Quit();

//**********************END SOUND TEST AREA 2**********************************************************

return 0;

}[/source]

I only want OpenGL to do rendering, but SDL to control sound and events.

That doesn't make much sense, what do you need GLUT then for? You can do the same OpenGL stuff with SDL, so why not just use it?

Derp


SDL and glut conflicts, since they like to control the same things.

Exactly! It do the same thing. You have to chose one and use it... If you want to use glut so just find another one sound handler ie OpenAL.
C x 2 C x o C x C f nice C x C s C x C c

[quote name='dreamslayerx' timestamp='1351605350' post='4995408']
I only want OpenGL to do rendering, but SDL to control sound and events.

That doesn't make much sense, what do you need GLUT then for? You can do the same OpenGL stuff with SDL, so why not just use it?
[/quote]

[quote name='dreamslayerx' timestamp='1351605350' post='4995408']
SDL and glut conflicts, since they like to control the same things.

Exactly! It do the same thing. You have to chose one and use it... If you want to use glut so just find another one sound handler ie OpenAL.
[/quote]

That's very true. I wanted to explore the functionality of both, but for now I will only use SDL. I think SDL provides a more straight forward approach. I haven't been able to find a really good tutorial for OpenAL for beginners. I'm going to adjust the code later and see what you guys think about it. I am going to use only SDL in the first case. Also any advice on whether I should use SDL or glut/OpenAL? Which would be more practical for creating an rpg game?

That's very true. I wanted to explore the functionality of both, but for now I will only use SDL. I think SDL provides a more straight forward approach. I haven't been able to find a really good tutorial for OpenAL for beginners. I'm going to adjust the code later and see what you guys think about it. I am going to use only SDL in the first case. Also any advice on whether I should use SDL or glut/OpenAL? Which would be more practical for creating an rpg game?
Use SDL for your projects. It provides set of completed tools to create nice looking games.
C x 2 C x o C x C f nice C x C s C x C c
I would use SDL too, but it doesn't matter that much. Remember that you could also use SDL for window handling/input and OpenAL for audio. Just don't make your game depending (too much) on some windowing thingie.

Derp

Thanks for the advice.

This topic is closed to new replies.

Advertisement