Here is a cleaned up, pared down version of the code… rather than putting all the code at the prior link again, I am just submitting the main file…
CD
//-----------------------------------------------------------------------------
// This code is based on an example from http://www.codesampler.com
// Original author information follows:
//
// Name: ogl_glslang_simple_vs2ps.cpp
// Author: Kevin Harris
// Last Modified: 04/21/05
//
//-----------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
//#include <string.h>
#include <GL/glew.h>
#include <GL/glut.h>
#include "textfile.h"
GLuint g_VertexShader = 0;
GLuint g_FragmentShader = 0;
GLuint g_ShaderProgram = 0;
GLuint g_TextureID;
GLint g_TextureWidth = 256;
GLint g_TextureHeight = 256;
GLint g_TextureLocation = -1;
// GL_T2F_C3F_V3F
struct Vertex
{
float tu, tv;
float r, g, b;
float x, y, z;
};
Vertex g_QuadVertices[] =
{
// tu, tv r g b x y z
{ 0.0f,0.0f, 1.0f,1.0f,0.0f, -1.0f,-1.0f, 0.0f },
{ 1.0f,0.0f, 1.0f,0.0f,0.0f, 1.0f,-1.0f, 0.0f },
{ 1.0f,1.0f, 0.0f,1.0f,0.0f, 1.0f, 1.0f, 0.0f },
{ 0.0f,1.0f, 0.0f,0.0f,1.0f, -1.0f, 1.0f, 0.0f },
};
////////////////////////////////////////////////////////////////////////////////
//
//
//
////////////////////////////////////////////////////////////////////////////////
void changeSize(int w, int h)
{
// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if(h == 0)
h = 1;
float ratio = 1.0* w / h;
// Reset the coordinate system before modifying
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Set the viewport to be the entire window
glViewport(0, 0, w, h);
// Set the correct perspective.
gluPerspective(45,ratio,1,1000);
glMatrixMode(GL_MODELVIEW);
}
////////////////////////////////////////////////////////////////////////////////
//
//
//
////////////////////////////////////////////////////////////////////////////////
void renderTexturedQuad(void)
{
// Clear the screen and the depth buffer
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0.0f, 0.0f, -4.0f );
glUseProgramObjectARB( g_ShaderProgram );
// eventually I need to use multiple textures....
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, g_TextureID );
if( g_TextureLocation != -1 ){
glUniform1i(g_TextureLocation,
0);
}
glInterleavedArrays( GL_T2F_C3F_V3F, 0, g_QuadVertices );
glDrawArrays( GL_QUADS, 0, 4 );
glUseProgramObjectARB( 0 );
glutSwapBuffers();
}
////////////////////////////////////////////////////////////////////////////////
//
//
//
////////////////////////////////////////////////////////////////////////////////
void processNormalKeys(unsigned char key, int x, int y)
{
if (key == 27)
exit(0);
}
////////////////////////////////////////////////////////////////////////////////
//
//
//
////////////////////////////////////////////////////////////////////////////////
void initializeShaders()
{
char *vertexShader = NULL;
char *fragmentShader1 = NULL;
g_VertexShader = glCreateShader(GL_VERTEX_SHADER);
g_FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
vertexShader = textFileRead("vertex_shader.vert");
fragmentShader1 = textFileRead("fragment_shader.frag");
const char * ff = fragmentShader1;
const char * vv = vertexShader;
glShaderSource(g_VertexShader, 1, &vv, NULL);
glShaderSource(g_FragmentShader, 1, &ff, NULL);
free(vertexShader);
free(fragmentShader1);
glCompileShader(g_VertexShader);
glCompileShader(g_FragmentShader);
g_ShaderProgram = glCreateProgram();
glAttachShader(g_ShaderProgram, g_FragmentShader);
glAttachShader(g_ShaderProgram, g_VertexShader);
glLinkProgram(g_ShaderProgram);
glUseProgram(g_ShaderProgram);
g_TextureLocation = glGetUniformLocationARB( g_ShaderProgram, "floatTexture" );
}
////////////////////////////////////////////////////////////////////////////////
//
//
//
////////////////////////////////////////////////////////////////////////////////
int initializeTextures()
{
int ret = -1;
// mem size = width * height * # components per texel
int textureMemSize = g_TextureWidth * g_TextureHeight * 4;
// Create Texture Data
GLfloat *rgbaFloatTextureData = new GLfloat[textureMemSize];
unsigned long int nIndex = 0;
unsigned long int nTexelIndex = 0;
for(int nRow = 0; nRow < g_TextureHeight; nRow++) {
for(int nCol = 0; nCol < g_TextureWidth; nCol++) {
nIndex = g_TextureWidth * nRow + nCol;
nTexelIndex = 4*nIndex;
GLdouble texVal = static_cast<GLfloat>(nRow/256.0);
#if 1
// ...this doesn't work
rgbaFloatTextureData[nTexelIndex + 0] = texVal;
rgbaFloatTextureData[nTexelIndex + 1] = texVal;
rgbaFloatTextureData[nTexelIndex + 2] = texVal;
rgbaFloatTextureData[nTexelIndex + 3] = 1.0;
#else
// ...but this seems to work
rgbaFloatTextureData[nTexelIndex + 0] = 0.3;
rgbaFloatTextureData[nTexelIndex + 1] = 0.6;
rgbaFloatTextureData[nTexelIndex + 2] = 0.9;
rgbaFloatTextureData[nTexelIndex + 3] = 1.0;
#endif
}
}
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glGenTextures(1, &g_TextureID);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, g_TextureID);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB,
0,
GL_FLOAT_RGBA32_NV,
g_TextureWidth,
g_TextureHeight,
0,
GL_RGBA,
GL_FLOAT,
rgbaFloatTextureData);
delete [] rgbaFloatTextureData;
rgbaFloatTextureData = 0;
return ret;
}
////////////////////////////////////////////////////////////////////////////////
//
//
//
////////////////////////////////////////////////////////////////////////////////
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("GLSL Texture Mapping");
glutDisplayFunc(renderTexturedQuad);
glutIdleFunc(renderTexturedQuad);
glutReshapeFunc(changeSize);
glutKeyboardFunc(processNormalKeys);
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glClearColor(0.0, 0.0, 0.0, 0.0);
glewInit();
if (glewIsSupported("GL_VERSION_2_0"))
printf("
Ready for OpenGL 2.0
");
else {
printf("
OpenGL 2.0 not supported
");
exit(1);
}
const GLubyte *glslVersion = glGetString(GL_SHADING_LANGUAGE_VERSION);
fprintf(stdout, "
GLSL Version: %s
", glslVersion);
initializeTextures();
initializeShaders();
glutMainLoop();
return 0;
}