Jump to content
  • Advertisement
Sign in to follow this  
OneMoreToGo

OpenGL Texture not drawing

This topic is 4422 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm just working on a class called "glSurface", as a clone of sorts of SDL_Surface. Right now it's pretty basic, but when I call the draw function it doesn't actually draw the texture, just the quad. Perhaps some of you could shed some light on my problem? Hear is the class:
Quote:
#include <cstdlib> #include <cstring> #include "OpenGL/gl.h" #include "OpenGL/glu.h" #include "IL/il.h" #include "IL/ilu.h" #include "IL/ilut.h" class glSurface { protected: GLint components; GLsizei width; GLsizei height; GLenum format; GLvoid *pixels; ILuint image_IL; GLuint texture_GL; int x; int y; public: glSurface(); int Open(char *); void Position(int, int); void Draw(); }; glSurface::glSurface() { ilGenImages(1, &image_IL); glGenTextures(1, &texture_GL); } int glSurface::Open(char filename[]) { ILint open_currentBound_IL = ilGetInteger(IL_CUR_IMAGE); ILboolean open_success_IL; ilBindImage(image_IL); open_success_IL = ilLoadImage(filename); if (!open_success_IL) { ilBindImage(open_currentBound_IL); return(-1); } components = ilGetInteger(IL_IMAGE_BPP); width = ilGetInteger(IL_IMAGE_WIDTH); height = ilGetInteger(IL_IMAGE_HEIGHT); format = ilGetInteger(IL_IMAGE_FORMAT); pixels = ilGetData(); ilBindImage(open_currentBound_IL); return(0); } void glSurface::Position(int tx, int ty) { x = tx; y = ty; } void glSurface::Draw() { glBindTexture(GL_TEXTURE_2D, texture_GL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, components, width, height, 0, format, GL_UNSIGNED_BYTE, pixels); glBegin(GL_QUADS); glTexCoord2i(0, 0); glVertex2i(x, y); glTexCoord2i(1, 0); glVertex2i(x + width, y); glTexCoord2i(1, 1); glVertex2i(x + width, y + height); glTexCoord2i(0, 1); glVertex2i(x, y + width); glEnd(); }
Thanks for any help available!

Share this post


Link to post
Share on other sites
Advertisement
Of course, though it is not indicated in this fragment of code. For reference, here is the sample main file I have been using to test this header:



#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <cmath>

#include "SDL.h"
#include "OpenGL/gl.h"
#include "OpenGL/glu.h"

#include "IL/il.h"
#include "IL/ilu.h"
#include "IL/ilut.h"

#include "FTGL_all.h"

using namespace std;

FTGLPixmapFont font("/System/Library/Fonts/Geneva.dfont");


/* Set up SDL, OpenGL & DevIL video stuff. */
void setupVideo(int width_sv, int height_sv, int bpp_sv, int fullscreen_sv) {
/* SDL. */
SDL_Init(SDL_INIT_VIDEO);
if (fullscreen_sv > 0) {
SDL_SetVideoMode(width_sv, height_sv, bpp_sv, SDL_OPENGL | SDL_HWSURFACE | SDL_FULLSCREEN);
}
else {
SDL_SetVideoMode(width_sv, height_sv, bpp_sv, SDL_OPENGL | SDL_HWSURFACE);
}
/* OpenGL. */
glViewport(0, 0, width_sv, height_sv);
glEnable(GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, width_sv, height_sv, 0.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(0.0f);
/* DevIL. */
ilInit();
iluInit();
ilutInit();
ilutRenderer(ILUT_OPENGL);
}

/* Drawing function. */
//Ignore it.
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

SDL_GL_SwapBuffers();
}

int main(int argc, char *argv[])
{
glSurface mySurf;
mySurf.Open("file.bmp");
mySurf.Position(0, 0);
mySurf.Draw();

SDL_GL_SwapBuffers();


return(0);
}


Share this post


Link to post
Share on other sites
You're not checking the return value from the glSurface::open() call. Is it possible that the open is failing? I'm not familiar with IL, so I can't comment on the correctness of your loading function.

As a side note, you don't want to be calling glTexImage2D() every frame. It should only be called once for a given image.

Share this post


Link to post
Share on other sites
Quote:
Original post by Dave Hunt
You're not checking the return value from the glSurface::open() call. Is it possible that the open is failing? I'm not familiar with IL, so I can't comment on the correctness of your loading function.

As a side note, you don't want to be calling glTexImage2D() every frame. It should only be called once for a given image.


Ah, true. I'll have to chuck a first time checker in there somewhere. I'll stick some cout notifiers in after ever command, and see what happens and what doesn't.

Share this post


Link to post
Share on other sites
Do you mean the order of the vertices? Yeah, I'm pretty sure they're ok.

I tried inserting little tags, to tell me what just happened as the code executed. It went fine. I stuck a cout warning in my loading success if loop, and it went fine too.

I then tried changing my drawing system so that it would rebind the IL image and draw taking everything directly from it.
After that, I thought to myself... Oh! It's because my glOrtho commands don't affect the texture grabbing commands, so I changed the TexCoord calls... still no luck!

Maybe it's my class or something... this is first class I ever wrote, aside from some practice ones...

Oh yeah, and I stuck a first draw check, to see if I had to call the glTex2d command. Here's the sligthly revised source:


#include <cstdlib>
#include <cstring>

#include "OpenGL/gl.h"
#include "OpenGL/glu.h"

#include "IL/il.h"
#include "IL/ilu.h"
#include "IL/ilut.h"

using namespace std;

class glSurface {

protected:
GLint components;
GLsizei width;
GLsizei height;
GLenum format;
GLvoid *pixels;

ILuint image_IL;
GLuint texture_GL;

int x;
int y;
int firstDraw;


public:
glSurface();
int Open(char *);
void Position(int, int);
void Draw();


};

glSurface::glSurface() {
ilGenImages(1, ?_IL);
glGenTextures(1, &texture_GL);
firstDraw = 1;
}

int glSurface::Open(char filename[]) {

ILint open_currentBound_IL = ilGetInteger(IL_CUR_IMAGE);
ILboolean open_success_IL;

ilBindImage(image_IL);
open_success_IL = ilLoadImage(filename);
if (open_success_IL == IL_FALSE) {
ilBindImage(open_currentBound_IL);
cout << "Problem!" << endl;
return(-1);
}
components = ilGetInteger(IL_IMAGE_BPP);
width = ilGetInteger(IL_IMAGE_WIDTH);
height = ilGetInteger(IL_IMAGE_HEIGHT);
format = ilGetInteger(IL_IMAGE_FORMAT);
pixels = ilGetData();

ilBindImage(open_currentBound_IL);

return(0);
}

void glSurface::Position(int tx, int ty) {
x = tx;
y = ty;
}

void glSurface::Draw() {
glBindTexture(GL_TEXTURE_2D, texture_GL);

if (firstDraw = 1) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, components, width, height, 0, format, GL_UNSIGNED_BYTE, pixels);
firstDraw = 0;
}

glBegin(GL_QUADS);
glTexCoord2i(0, 0); glVertex2i(x, y);
glTexCoord2i(0, 1); glVertex2i(x + width, y);
glTexCoord2i(1, 1); glVertex2i(x + width, y + height);
glTexCoord2i(1, 0); glVertex2i(x, y + width);
glEnd();
}


Share this post


Link to post
Share on other sites
erm, judging by the test code you have provided you dont set up opengl before atempting to use OpenGL commands, this is going to fail.

Also, as a point of reference, unless you mention it there is no 'of course' about anything you do, some people make very simple mistakes when asking for help so we can't assume you've done anything unless you state you have done so.

Share this post


Link to post
Share on other sites
Quote:
Original post by phantom
erm, judging by the test code you have provided you dont set up opengl before atempting to use OpenGL commands, this is going to fail.

Also, as a point of reference, unless you mention it there is no 'of course' about anything you do, some people make very simple mistakes when asking for help so we can't assume you've done anything unless you state you have done so.


Ah yes, just noticed that. The setupVideo() command is actually called, I forgot it in that source snippet there.

Thanks!

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!