Texture not drawing

Started by
7 comments, last by OneMoreToGo 17 years, 9 months ago
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, ℑ_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!
Advertisement
First, use source tags, not quote tags for source code.

Second, did you glEnable textures?
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);}
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.
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.
Are you drawing the face in the right order (front/back face) ??
- Iliak -
[ ArcEngine: An open source .Net gaming framework ]
[ Dungeon Eye: An open source remake of Eye of the Beholder II ]
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();}
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.
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!

This topic is closed to new replies.

Advertisement