Sign in to follow this  

OpenGL opengl game engine [help]

This topic is 2113 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

hey there,
im having a bit of trouble with my code as the texture co-ordinates are not binding to the texture :/
would you be so kind as to look at my code and show me where im going wrong, im only just learning opengl but i am a pro at c++.

main.h
[CODE]
//Include STD headers
#ifndef MAIN_H
#define MAIN_H

#include<GL/glew.h>
#include<GL/glfw.h>
#include<GL/freeglut.h>
#include <vector>
#include<algorithm>
#include <fstream>
#include<cstdio>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <cmath>
#include <SFML/Graphics.hpp>
#include <SOIL.h>

//Include GLM
#include <glm/glm.hpp>
using namespace std;
extern GLuint loadShader(const char* vertex_file_path, const char* fragment_file_path);
extern int loadTexture(const char* texfilename,GLuint textureObject);
extern void deleteTexture(GLuint textureObject);
extern void InitializeWindow();
extern void shutdown();
#endif
[/CODE]

main.cpp
[CODE]
#include "main.h"
#include "3dsloader.h"
#include "camera.h"
#include "skybox.h"
bool mousein= false;
GLuint programID;
void lighting();
void initRendering();
void drawScene();
void mainLoop();
FPSCamera * camera;
Object* testcube;
//skybox* sky;

int main(int argc, char **argv)
{
bool running = true;

InitializeWindow();

//sky->initSkybox("assets/skybox/citystorm/xpos.jpg","assets/skybox/citystorm/xneg.jpg","assets/skybox/citystorm/ypos.jpg","assets/skybox/citystorm/yneg.jpg","assets/skybox/citystorm/zpos.jpg","assets/skybox/citystorm/zneg.jpg");
//sky->skyboxVBO();
testcube = new Object("teapot.3ds");

testcube->CreateVBO();
// apply texture to all meshes that have texels
testcube->applyTexture("teapot.jpg");
initRendering();

//shader setup
programID = loadShader("emptyshader.vert","bokehDOF.frag");
mainLoop();


return 0;
}
void initRendering()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
// Enable lighting and set the position of the light
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
GLfloat pos[] = { 0.0, 4.0, 4.0 };
glLightfv(GL_LIGHT0, GL_POSITION, pos);


//use shader
glUseProgram(programID);

}

void mainLoop(void)
{
// the time of the previous frame
double old_time = glfwGetTime();
// this just loops as long as the program runs
while(1)
{
// KEY EVENTS 1
// escape to quit,


camera->updateCamera();

if (glfwGetKey(GLFW_KEY_ESC) == GLFW_PRESS)
break;

if (glfwGetMouseButton(GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS)
{
mousein = true;
glfwDisable(GLFW_MOUSE_CURSOR);

}
if(glfwGetKey('P') == GLFW_PRESS)
{
mousein=false;
glfwEnable(GLFW_MOUSE_CURSOR);

}
camera->Control(0.2,0.2,mousein);
// draw the figure

drawScene();


// swap back and front buffers
glfwSwapBuffers();

}
}

void drawScene()
{
//clear info from last draw
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//skybox for scene
//sky->drawSkybox();
// ADD SCENE OBJECTS TO RENDER HERE


//model loading and stuff
testcube->Draw();

glLoadIdentity();
};

void shutdown()
{
glfwTerminate();
//sky->destroySkybox();
//delete sky;
//sky= NULL;

delete testcube;
testcube = NULL;
delete camera;
camera = NULL;
exit(1);
}
[/CODE]
3dsloader.h
[CODE]

#include "main.h"
#include "lib3ds/file.h"
#include "lib3ds/mesh.h"
#include "lib3ds/material.h"

class Object
{
public:
Object(std:: string filename);
virtual ~Object();
virtual void Draw() const;
virtual void CreateVBO();
void applyTexture(const char*texfilename);
protected:
void GetFaces();
unsigned int m_TotalFaces;
Lib3dsFile * m_model;
Lib3dsMesh* Mesh;
vector<GLuint> textureIndices;
GLuint textureObject;
GLuint m_VertexVBO, m_NormalVBO, m_TexCoordVBO;
};
[/CODE]

3dsloader.cpp
[CODE]
#include "3dsloader.h"

Object::Object(std:: string filename)
{
m_TotalFaces = 0;
m_model = lib3ds_file_load(filename.c_str());
// If loading the model failed, we throw an exception
if(!m_model)
{
throw strcat("Unable to load ", filename.c_str());
}
// set properties of texture coordinate generation for both x and y coordinates
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
// if not already enabled, enable texture generation
if(! glIsEnabled(GL_TEXTURE_GEN_S))
glEnable(GL_TEXTURE_GEN_S);
if(! glIsEnabled(GL_TEXTURE_GEN_T))
glEnable(GL_TEXTURE_GEN_T);
lib3ds_file_eval(m_model, 0); // set current frame to 0

}
Object::~Object()
{
if(m_model) // if the file isn't freed yet
lib3ds_file_free(m_model); //free up memory
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
//disable texture generation
for(unsigned int i = 0;i < textureIndices.size();i++)
glDeleteTextures(1, &textureIndices.at(i));
}

void Object::GetFaces()
{
m_TotalFaces = 0;
Lib3dsMesh * mesh;
// Loop through every mesh.
for(mesh = m_model->meshes;mesh != NULL;mesh = mesh->next)
{
// Add the number of faces this mesh has to the total number of faces.
m_TotalFaces += mesh->faces;
}
}
void Object::CreateVBO()
{
assert(m_model != NULL);
// Calculate the number of faces we have in total
GetFaces();
// Allocate memory for our vertices and normals
Lib3dsVector * vertices = new Lib3dsVector[m_TotalFaces * 3];
Lib3dsVector * normals = new Lib3dsVector[m_TotalFaces * 3];
Lib3dsTexel* texCoords = new Lib3dsTexel[m_TotalFaces * 3];
Lib3dsMesh * mesh;
unsigned int FinishedFaces = 0;
// Loop through all the meshes
for(mesh = m_model->meshes;mesh != NULL;mesh = mesh->next)
{
lib3ds_mesh_calculate_normals(mesh, &normals[FinishedFaces*3]);
// Loop through every face
for(unsigned int cur_face = 0; cur_face < mesh->faces;cur_face++)
{
Lib3dsFace * face = &mesh->faceL[cur_face];
for(unsigned int i = 0;i < 3;i++)
{

//NEW
if(mesh->texels)
{
memcpy(&texCoords[FinishedFaces*3 + i], mesh->texelL[face->points[ i ]], sizeof(Lib3dsTexel));
//NEW
}
memcpy(&vertices[FinishedFaces*3 + i], mesh->pointL[face->points[ i ]].pos, sizeof(Lib3dsVector));
}

FinishedFaces++;
}
}
// Generate a Vertex Buffer Object and store it with our vertices
glGenBuffers(1, &m_VertexVBO);
glBindBuffer(GL_ARRAY_BUFFER, m_VertexVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Lib3dsVector) * 3 * m_TotalFaces, vertices, GL_STATIC_DRAW);
// Generate another Vertex Buffer Object and store the normals in it
glGenBuffers(1, &m_NormalVBO);
glBindBuffer(GL_ARRAY_BUFFER, m_NormalVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Lib3dsVector) * 3 * m_TotalFaces, normals, GL_STATIC_DRAW);
// Generate a third VBO and store the texture coordinates in it.
glGenBuffers(1, &m_TexCoordVBO);
glBindBuffer(GL_ARRAY_BUFFER, m_TexCoordVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Lib3dsTexel) * 3 * m_TotalFaces, texCoords, GL_STATIC_DRAW);

// Clean up our allocated memory
delete vertices;
delete normals;

// We no longer need lib3ds
lib3ds_file_free(m_model);
m_model = NULL;
}
void Object::applyTexture(const char*texfilename)
{

float imageWidth;
float imageHeight;
GLuint tmpIndex; // temporary index to old the place of our texture POINTER FOR MULTIPLE??
glGenTextures(1, &tmpIndex); // allocate memory for one texture

tmpIndex = SOIL_load_OGL_texture(texfilename,SOIL_LOAD_AUTO,SOIL_CREATE_NEW_ID,SOIL_FLAG_MIPMAPS);
glBindTexture(GL_TEXTURE_2D, tmpIndex); // use our newest textur
glPixelStorei(GL_UNPACK_ALIGNMENT,1);

glGetTexLevelParameterfv(GL_TEXTURE_2D,0,GL_TEXTURE_WIDTH,&imageWidth);
glGetTexLevelParameterfv(GL_TEXTURE_2D,0,GL_TEXTURE_HEIGHT,&imageHeight);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // give the best result for texture magnification
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //give the best result for texture minification
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); // don't repeat texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); // don't repeat textureglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); // don't repeat texture
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,imageWidth,imageHeight,0,GL_RGB,GL_UNSIGNED_BYTE,&tmpIndex);
}

void Object::Draw() const
{
// Enable vertex, normal and texture-coordinate arrays.
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// Bind the VBO with the normals.
glBindBuffer(GL_ARRAY_BUFFER, m_NormalVBO);
// The pointer for the normals is NULL which means that OpenGL will use the currently bound VBO.
glNormalPointer(GL_FLOAT, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, m_TexCoordVBO);
glTexCoordPointer(2, GL_FLOAT, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, m_VertexVBO);
glVertexPointer(3, GL_FLOAT, 0, NULL);
// Render the triangles.
glDrawArrays(GL_TRIANGLES, 0, m_TotalFaces * 3);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
[/CODE]

initialize.cpp
[CODE]
#include "main.h"

void shutdown();
void InitializeWindow()
{
const int window_width = 800,
window_height = 600;

if (glfwInit() != GL_TRUE)
shutdown();
// 800 x 600, 16 bit color, no depth, alpha or stencil buffers, windowed
if (glfwOpenWindow(window_width, window_height, 5, 6, 5,
0, 0, 0, GLFW_WINDOW) != GL_TRUE)
shutdown();
glfwSetWindowTitle("Pheonix engine R1");
glewInit();
glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4); // 4x antialiasing
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); // We want OpenGL 3.1
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 1);
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //We don't want the old OpenGL
// set the projection matrix to a normal frustum with a max depth of 50
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float aspect_ratio = ((float)window_height) / window_width;

//culling etc
GLfloat zNear = 0.1f;
GLfloat zFar = 255.0f;

GLfloat fH = tan( float(45 / 360.0f * 3.14159f) ) * zNear;
GLfloat fW = fH * aspect_ratio;
glFrustum( -fW, fW, -fH, fH, zNear, zFar );

glMatrixMode(GL_MODELVIEW);

}

[/CODE]

any insight into my problem is welcome,

also, with gl frustum, how can i make sure there is no warping of models from field of view. i also heard it was depreciated so an alternative would be awesome, thanks!

Share this post


Link to post
Share on other sites
I'm going to follow the same trend I did in your previous threads:

What does your shader look like?
Is your texture actually loaded? What is the ID returned by soil?
Are your UV coordinates properly loaded?
What does the model look like now?

Share this post


Link to post
Share on other sites
[quote]
What does your shader look like?
Is your texture actually loaded? What is the ID returned by soil?
Are your UV coordinates properly loaded?
What does the model look like now?
[/quote]

1. no shader is actualy being loaded for the rendering of the model (should there be?)
2. yes the texture is loaded, the real question is how can i find the ID generated by soil?
3. UV co-ordinates are parsed and are in the 3ds file.
4. model looks just like a lit teapot with no texture.

Share this post


Link to post
Share on other sites
[quote name='Adam West' timestamp='1333227209' post='4927016']
1. no shader is actualy being loaded for the rendering of the model (should there be?)
[/quote]
No, doesn't have to, but I see one being loaded in your program and as I don't know your full code, I don't want to assume you're not doing anything with it.

[quote name='Adam West' timestamp='1333227209' post='4927016']
2. yes the texture is loaded, the real question is how can i find the ID generated by soil?
[/quote]
Well.. Obviously this:
[code]tmpIndex = SOIL_load_OGL_texture(texfilename,SOIL_LOAD_AUTO,SOIL_CREATE_NEW_ID,SOIL_FLAG_MIPMAPS);[/code]
tmpIndex should return something other than 0. If this is 0 it means you are not loading your texture properly.

Also, SOIL takes all the loading for you, do you really need all the texture functions? I'm sure you don't need glGenTextures and glTexImage2D when using SOIL. As far as I know, all you need to do with SOIL is load your texture which returns the ID, which in turn you can use with glBindTexture.

[quote name='Adam West' timestamp='1333227209' post='4927016']
3. UV co-ordinates are parsed and are in the 3ds file.
[/quote]
Just make sure they are correct and you use them correctly. I see you allocating texel data as if it has 3 elements, yet in your drawing routine you say there are 2. Also I am not sure if you need to keep binding your buffers that way. (might be wrong on that one, not a complete openGL guru here).

[quote name='Adam West' timestamp='1333227209' post='4927016']
4. model looks just like a lit teapot with no texture.
[/quote]

Take baby steps when debugging, make sure all the data is as you expect it should be.

Share this post


Link to post
Share on other sites
thanks reloaded_,
that actually makes a lot more sense than other feeback i've been getting.

okay so the texture get assigned to the model now but the co-ordinates do not match up to the model.
i have done a bit of modding of my source and i have come up with this:
[CODE]
void Object::applyTexture(const char*texfilename)
{

textureObject = SOIL_load_OGL_texture(texfilename,SOIL_LOAD_AUTO,SOIL_CREATE_NEW_ID,SOIL_FLAG_MIPMAPS);

glBindTexture(GL_TEXTURE_2D,textureObject);// use our newest texture
}

void Object::Draw() const
{



// Enable vertex, normal and texture-coordinate arrays.
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);



// Bind the VBO with the normals.
glBindBuffer(GL_ARRAY_BUFFER, m_NormalVBO);
// The pointer for the normals is NULL which means that OpenGL will use the currently bound VBO.
glNormalPointer(GL_FLOAT, 0, NULL);

glBindBuffer(GL_ARRAY_BUFFER, m_TexCoordVBO);
glTexCoordPointer(3,GL_FLOAT,sizeof(Lib3dsVector), NULL);
glBindBuffer(GL_ARRAY_BUFFER, m_VertexVBO);
glVertexPointer(3, GL_FLOAT, 0, NULL);
// Render the triangles.
glDrawArrays(GL_TRIANGLES, 0, m_TotalFaces * 3);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
[/CODE]

im really stuck now as i want the texture map to match the object. currently it looks like this:


[URL=http://imageshack.us/photo/my-images/703/currentno.png/][IMG]http://img703.imageshack.us/img703/672/currentno.png[/IMG][/URL]

Uploaded with [URL=http://imageshack.us]ImageShack.us[/URL]

Share this post


Link to post
Share on other sites
It's getting somewhere. You changed your texel data to a vector, which I am assuming has 3 components. UV coordinates mostly (if not always) come with 2 Components which was probably what your texel data has. Try changing your code to only us texel data where your texcoord data is concerned.

Share this post


Link to post
Share on other sites
[quote name='Reloadead_' timestamp='1333361175' post='4927424']
It's getting somewhere. You changed your texel data to a vector, which I am assuming has 3 components. UV coordinates mostly (if not always) come with 2 Components which was probably what your texel data has. Try changing your code to only us texel data where your texcoord data is concerned.
[/quote]

hmm, bringing it down to two components causes a crash at runtime.

Share this post


Link to post
Share on other sites
Hidden
[quote name='Adam West' timestamp='1333418055' post='4927733']
bringing it down to two components causes a crash at runtime.
[/quote]
[b][size=6][url="http://www.gamedev.net/topic/621666-debug-assertion-failed-on-game-project/page__view__findpost__p__4921180"]HELLO HAVE YOU TRIED DEBUGGING THIS PART OF THE CODE WHICH IS MOST LIKELY THE CAUSE[/url][/size][/b]

Share this post


Link to post
Your problem most likely resides [url=http://www.gamedev.net/topic/621666-debug-assertion-failed-on-game-project/page__view__findpost__p__4921180]here[/url] (as I have tried to point out several times before in multiple threads). Have you tried [url=http://www.esu.edu/~elee/help/Debugging/debugTutorial.htm]debugging[/url] the problem? (I'm inferring a Visual Studio/Windows setup here.)

Share this post


Link to post
Share on other sites
[quote name='fastcall22' timestamp='1333434321' post='4927796']
Your problem most likely resides [url="http://www.gamedev.net/topic/621666-debug-assertion-failed-on-game-project/page__view__findpost__p__4921180"]here[/url] (as I have tried to point out several times before in multiple threads). Have you tried [url="http://www.esu.edu/~elee/help/Debugging/debugTutorial.htm"]debugging[/url] the problem? (I'm inferring a Visual Studio/Windows setup here.)
[/quote]

nope.avi

strcat is fine, its the way the object memory is handeled

Share this post


Link to post
Share on other sites
[quote name='Adam West' timestamp='1333451881' post='4927839']
[quote name='fastcall22' timestamp='1333434321' post='4927796']
Your problem most likely resides [url="http://www.gamedev.net/topic/621666-debug-assertion-failed-on-game-project/page__view__findpost__p__4921180"]here[/url] (as I have tried to point out several times before in multiple threads). Have you tried [url="http://www.esu.edu/%7Eelee/help/Debugging/debugTutorial.htm"]debugging[/url] the problem? (I'm inferring a Visual Studio/Windows setup here.)
[/quote]

nope.avi

strcat is fine, its the way the object memory is handeled
[/quote]

throw strcat("Unable to load ", filename.c_str());

is not fine, read the strcat documentation, while it isn't the cause of your problem it will cause problems if a model fails to load.

i see a few more things:

you are assuming that you'll have 3 times as many vertices and tex coords as faces, this isn't necessarily the case. It shouldn't be possible to have more than 3x the facecount though so in worst case you're only wasting memory, the 3ds format however does support indices which you aren't using, (so i assume you are exporting it so that faces never share vertices (otherwise it wouldn't render properly) its not a very efficient way to do things though. (as your VBOs will be alot bigger than they need to be).
(Other model formats might also allow the number of texcoords to be different from the number of vertices (.3ds doesn't seem to support that though)
(Its still worth reading the vertex and texcoord count from the mesh data rather than making assumptions about it)


This part might warrant a error check and could possibly be the source of your problem:

[code]
if(mesh->texels)
{
memcpy(&texCoords[FinishedFaces*3 + i], mesh->texelL[face->points[ i ]], sizeof(Lib3dsTexel));
//NEW
}

[/code]

If there are no texture coordinates exported in the 3ds file nothing will get copied to texCoords and you'll be using an uninitialized buffer (containing random data) which could be the cause of your wierd results.

Share this post


Link to post
Share on other sites
okay fixed the strcat to just a normal filename and removed the if(mesh->textels) but still no dice.

[CODE]
#include "3dsloader.h"
#include "shader.h"

Object::Object(const char* filename)
{
m_TotalFaces = 0;
m_model = lib3ds_file_load(filename);
// If loading the model failed, we throw an exception
if(!m_model)
{
cout << ("Unable to load ", filename);
}
}
Object::~Object()
{
if(m_model) // if the file isn't freed yet
lib3ds_file_free(m_model); //free up memory
}

void Object::GetFaces()
{
m_TotalFaces = 0;
Lib3dsMesh * mesh;
// Loop through every mesh.
for(mesh = m_model->meshes;mesh != NULL;mesh = mesh->next)
{
// Add the number of faces this mesh has to the total number of faces.
m_TotalFaces += mesh->faces;
}
}
void Object::CreateVBO()
{
assert(m_model != NULL);
// Calculate the number of faces we have in total
GetFaces();
// Allocate memory for our vertices and normals
Lib3dsVector * vertices = new Lib3dsVector[m_TotalFaces * 3];
Lib3dsVector * normals = new Lib3dsVector[m_TotalFaces * 3];
Lib3dsTexel* texCoords = new Lib3dsTexel[m_TotalFaces * 3];

Lib3dsMesh * mesh;
unsigned int FinishedFaces = 0;
// Loop through all the meshes
for(mesh = m_model->meshes;mesh != NULL;mesh = mesh->next)
{
lib3ds_mesh_calculate_normals(mesh, &normals[FinishedFaces*3]);
// Loop through every face
for(unsigned int cur_face = 0; cur_face < mesh->faces;cur_face++)
{

Lib3dsFace * face = &mesh->faceL[cur_face];
for(unsigned int i = 0;i < 3;i++)
{

memcpy(&texCoords[FinishedFaces*3 + i], mesh->texelL[face->points[ i ]], sizeof(Lib3dsTexel));
//NEW

memcpy(&vertices[FinishedFaces*3 + i], mesh->pointL[face->points[ i ]].pos, sizeof(Lib3dsVector));
}

FinishedFaces++;
}
}

// Generate a Vertex Buffer Object and store it with our vertices
glGenBuffers(1, &m_VertexVBO);
glBindBuffer(GL_ARRAY_BUFFER, m_VertexVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Lib3dsVector) * 3 * m_TotalFaces, vertices, GL_STATIC_DRAW);
// Generate another Vertex Buffer Object and store the normals in it
glGenBuffers(1, &m_NormalVBO);
glBindBuffer(GL_ARRAY_BUFFER, m_NormalVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Lib3dsVector) * 3 * m_TotalFaces, normals, GL_STATIC_DRAW);
// Generate a third VBO and store the texture coordinates in it.
glGenBuffers(1, &m_TexCoordVBO);
glBindBuffer(GL_ARRAY_BUFFER, m_TexCoordVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Lib3dsTexel) * 3 * m_TotalFaces, texCoords, GL_STATIC_DRAW);

// Clean up our allocated memory
delete vertices;
delete normals;
delete texCoords;

// We no longer need lib3ds
lib3ds_file_free(m_model);
m_model = NULL;
}
void Object::applyTexture(const char*texfilename)
{

textureObject = SOIL_load_OGL_texture(texfilename,SOIL_LOAD_AUTO,SOIL_CREATE_NEW_ID,SOIL_FLAG_MIPMAPS);

glBindTexture(GL_TEXTURE_2D,textureObject);// use our newest texture
}

void Object::Draw() const
{



// Enable vertex, normal and texture-coordinate arrays.
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);



// Bind the VBO with the normals.
glBindBuffer(GL_ARRAY_BUFFER, m_NormalVBO);
// The pointer for the normals is NULL which means that OpenGL will use the currently bound VBO.
glNormalPointer(GL_FLOAT, 0, NULL);

glBindBuffer(GL_ARRAY_BUFFER, m_TexCoordVBO);
glTexCoordPointer(2, GL_FLOAT, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, m_VertexVBO);
glVertexPointer(3, GL_FLOAT, 0, NULL);
// Render the triangles.
glDrawArrays(GL_TRIANGLES, 0, m_TotalFaces * 3);


glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
[/CODE]

Share this post


Link to post
Share on other sites
I didn't tell you to remove if (mesh-texels)..., i told you to handle the case where texels is 0 allthough now it should most likely crash instead if you don't have texture data exported, (not really a good thing but atleast it rules out a lack of texturecoordinates as the source of the problem).

Have you tried drawing a quad using the texture ? does that look correct ? (if not its a problem with how you load the texture)
What does the teapot look like in your 3d modelling application ? (screenshots would be nice)
What does the teapot look like if you re-import the .3ds file in your 3d modelling application ? (again screenshots)

Share this post


Link to post
Share on other sites
tried a pre uv'd turbosquid model to see if it was my fault but the same thing happened to it aswell, there must be something missing in my code??

Share this post


Link to post
Share on other sites
[quote name='Reloadead_' timestamp='1333565569' post='4928277']
Did you try changing your UV coordinated from a 3 component container to a 2 component container (like I mentioned earlier)
[/quote]

yes i did but that just made it crash strangely, unless i did it wrong this is what it looked like:
[CODE]

Lib3dsTexel* texCoords = new Lib3dsTexel[m_TotalFaces * 2];

[/CODE]
then,

[CODE]memcpy(&texCoords[FinishedFaces*2 + i], mesh->texelL[face->points[ i ]], sizeof(Lib3dsTexel));[/CODE]

lastly,



[CODE]

glGenBuffers(1, &m_TexCoordVBO);
glBindBuffer(GL_ARRAY_BUFFER, m_TexCoordVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Lib3dsTexel) * 2 * m_TotalFaces, texCoords, GL_STATIC_DRAW);


[/CODE]

it generated a massive memory exception :(

Share this post


Link to post
Share on other sites
[quote name='Adam West' timestamp='1333584946' post='4928340']
[quote name='Reloadead_' timestamp='1333565569' post='4928277']
Did you try changing your UV coordinated from a 3 component container to a 2 component container (like I mentioned earlier)
[/quote]

yes i did but that just made it crash strangely, unless i did it wrong this is what it looked like:
[CODE]

Lib3dsTexel* texCoords = new Lib3dsTexel[m_TotalFaces * 2];

[/CODE]
then,

[CODE]memcpy(&texCoords[FinishedFaces*2 + i], mesh->texelL[face->points[ i ]], sizeof(Lib3dsTexel));[/CODE]

lastly,



[CODE]

glGenBuffers(1, &m_TexCoordVBO);
glBindBuffer(GL_ARRAY_BUFFER, m_TexCoordVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Lib3dsTexel) * 2 * m_TotalFaces, texCoords, GL_STATIC_DRAW);


[/CODE]

it generated a massive memory exception [img]http://public.gamedev.net//public/style_emoticons/default/sad.png[/img]
[/quote]

That doesn't change the texture coordinate from 3 components to 2 components, that makes you only store texture coordinates for 2 of the 3 points on each triangle.

Share this post


Link to post
Share on other sites
[quote name='SimonForsman' timestamp='1333587077' post='4928343']
[quote name='Adam West' timestamp='1333584946' post='4928340']
[quote name='Reloadead_' timestamp='1333565569' post='4928277']
Did you try changing your UV coordinated from a 3 component container to a 2 component container (like I mentioned earlier)
[/quote]

yes i did but that just made it crash strangely, unless i did it wrong this is what it looked like:
[CODE]

Lib3dsTexel* texCoords = new Lib3dsTexel[m_TotalFaces * 2];

[/CODE]
then,

[CODE]memcpy(&texCoords[FinishedFaces*2 + i], mesh->texelL[face->points[ i ]], sizeof(Lib3dsTexel));[/CODE]

lastly,



[CODE]

glGenBuffers(1, &m_TexCoordVBO);
glBindBuffer(GL_ARRAY_BUFFER, m_TexCoordVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Lib3dsTexel) * 2 * m_TotalFaces, texCoords, GL_STATIC_DRAW);


[/CODE]

it generated a massive memory exception [img]http://public.gamedev.net//public/style_emoticons/default/sad.png[/img]
[/quote]

That doesn't change the texture coordinate from 3 components to 2 components, that makes you only store texture coordinates for 2 of the 3 points on each triangle.
[/quote]

okay then, could you please tell me how to make it only 2 components?

Share this post


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

  • Similar Content

    • By xhcao
      Does sync be needed to read texture content after access texture image in compute shader?
      My simple code is as below,
      glUseProgram(program.get());
      glBindImageTexture(0, texture[0], 0, GL_FALSE, 3, GL_READ_ONLY, GL_R32UI);
      glBindImageTexture(1, texture[1], 0, GL_FALSE, 4, GL_WRITE_ONLY, GL_R32UI);
      glDispatchCompute(1, 1, 1);
      // Does sync be needed here?
      glUseProgram(0);
      glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
      glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                                     GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture[1], 0);
      glReadPixels(0, 0, kWidth, kHeight, GL_RED_INTEGER, GL_UNSIGNED_INT, outputValues);
       
      Compute shader is very simple, imageLoad content from texture[0], and imageStore content to texture[1]. Does need to sync after dispatchCompute?
    • By Jonathan2006
      My question: is it possible to transform multiple angular velocities so that they can be reinserted as one? My research is below:
      // This works quat quaternion1 = GEQuaternionFromAngleRadians(angleRadiansVector1); quat quaternion2 = GEMultiplyQuaternions(quaternion1, GEQuaternionFromAngleRadians(angleRadiansVector2)); quat quaternion3 = GEMultiplyQuaternions(quaternion2, GEQuaternionFromAngleRadians(angleRadiansVector3)); glMultMatrixf(GEMat4FromQuaternion(quaternion3).array); // The first two work fine but not the third. Why? quat quaternion1 = GEQuaternionFromAngleRadians(angleRadiansVector1); vec3 vector1 = GETransformQuaternionAndVector(quaternion1, angularVelocity1); quat quaternion2 = GEQuaternionFromAngleRadians(angleRadiansVector2); vec3 vector2 = GETransformQuaternionAndVector(quaternion2, angularVelocity2); // This doesn't work //quat quaternion3 = GEQuaternionFromAngleRadians(angleRadiansVector3); //vec3 vector3 = GETransformQuaternionAndVector(quaternion3, angularVelocity3); vec3 angleVelocity = GEAddVectors(vector1, vector2); // Does not work: vec3 angleVelocity = GEAddVectors(vector1, GEAddVectors(vector2, vector3)); static vec3 angleRadiansVector; vec3 angularAcceleration = GESetVector(0.0, 0.0, 0.0); // Sending it through one angular velocity later in my motion engine angleVelocity = GEAddVectors(angleVelocity, GEMultiplyVectorAndScalar(angularAcceleration, timeStep)); angleRadiansVector = GEAddVectors(angleRadiansVector, GEMultiplyVectorAndScalar(angleVelocity, timeStep)); glMultMatrixf(GEMat4FromEulerAngle(angleRadiansVector).array); Also how do I combine multiple angularAcceleration variables? Is there an easier way to transform the angular values?
    • By dpadam450
      I have this code below in both my vertex and fragment shader, however when I request glGetUniformLocation("Lights[0].diffuse") or "Lights[0].attenuation", it returns -1. It will only give me a valid uniform location if I actually use the diffuse/attenuation variables in the VERTEX shader. Because I use position in the vertex shader, it always returns a valid uniform location. I've read that I can share uniforms across both vertex and fragment, but I'm confused what this is even compiling to if this is the case.
       
      #define NUM_LIGHTS 2
      struct Light
      {
          vec3 position;
          vec3 diffuse;
          float attenuation;
      };
      uniform Light Lights[NUM_LIGHTS];
       
       
    • By pr033r
      Hello,
      I have a Bachelor project on topic "Implenet 3D Boid's algorithm in OpenGL". All OpenGL issues works fine for me, all rendering etc. But when I started implement the boid's algorithm it was getting worse and worse. I read article (http://natureofcode.com/book/chapter-6-autonomous-agents/) inspirate from another code (here: https://github.com/jyanar/Boids/tree/master/src) but it still doesn't work like in tutorials and videos. For example the main problem: when I apply Cohesion (one of three main laws of boids) it makes some "cycling knot". Second, when some flock touch to another it scary change the coordination or respawn in origin (x: 0, y:0. z:0). Just some streng things. 
      I followed many tutorials, change a try everything but it isn't so smooth, without lags like in another videos. I really need your help. 
      My code (optimalizing branch): https://github.com/pr033r/BachelorProject/tree/Optimalizing
      Exe file (if you want to look) and models folder (for those who will download the sources):
      http://leteckaposta.cz/367190436
      Thanks for any help...

    • By Andrija
      I am currently trying to implement shadow mapping into my project , but although i can render my depth map to the screen and it looks okay , when i sample it with shadowCoords there is no shadow.
      Here is my light space matrix calculation
      mat4x4 lightViewMatrix; vec3 sun_pos = {SUN_OFFSET * the_sun->direction[0], SUN_OFFSET * the_sun->direction[1], SUN_OFFSET * the_sun->direction[2]}; mat4x4_look_at(lightViewMatrix,sun_pos,player->pos,up); mat4x4_mul(lightSpaceMatrix,lightProjMatrix,lightViewMatrix); I will tweak the values for the size and frustum of the shadow map, but for now i just want to draw shadows around the player position
      the_sun->direction is a normalized vector so i multiply it by a constant to get the position.
      player->pos is the camera position in world space
      the light projection matrix is calculated like this:
      mat4x4_ortho(lightProjMatrix,-SHADOW_FAR,SHADOW_FAR,-SHADOW_FAR,SHADOW_FAR,NEAR,SHADOW_FAR); Shadow vertex shader:
      uniform mat4 light_space_matrix; void main() { gl_Position = light_space_matrix * transfMatrix * vec4(position, 1.0f); } Shadow fragment shader:
      out float fragDepth; void main() { fragDepth = gl_FragCoord.z; } I am using deferred rendering so i have all my world positions in the g_positions buffer
      My shadow calculation in the deferred fragment shader:
      float get_shadow_fac(vec4 light_space_pos) { vec3 shadow_coords = light_space_pos.xyz / light_space_pos.w; shadow_coords = shadow_coords * 0.5 + 0.5; float closest_depth = texture(shadow_map, shadow_coords.xy).r; float current_depth = shadow_coords.z; float shadow_fac = 1.0; if(closest_depth < current_depth) shadow_fac = 0.5; return shadow_fac; } I call the function like this:
      get_shadow_fac(light_space_matrix * vec4(position,1.0)); Where position is the value i got from sampling the g_position buffer
      Here is my depth texture (i know it will produce low quality shadows but i just want to get it working for now):
      sorry because of the compression , the black smudges are trees ... https://i.stack.imgur.com/T43aK.jpg
      EDIT: Depth texture attachment:
      glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT24,fbo->width,fbo->height,0,GL_DEPTH_COMPONENT,GL_FLOAT,NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, fbo->depthTexture, 0);
  • Popular Now