PDA

View Full Version : Superbible 5ed Chapter6 Shaded Triangle Example



Mooncabbage
11-11-2011, 08:17 AM
My exact problem is thus:

The triangle renders as black. Initially I thought I was rendering nothing at all but then I changed the clearing colour to a medium grey, and lo, there is a black triangle.

The odd thing is, the same code works just fine on my GF's computer, so it seems it's not so much a problem with the code as it is my computer. I'm having a lot of issues like that though, and I'd like to know why.

My video card is an ATi Radeon HD4870X2, with the latest drivers. It shouldn't have any problems with OpenGL 3.3 or GLSL 3.30 code, so I'm baffled.

Any help whatsoever would be greatly appreciated.

BionicBytes
11-11-2011, 09:08 AM
no, your problem is that you want people to help but give them nothing to go on. No code, no screen shots, nothing.
We could guess, but guess what...why bother.

V-man
11-11-2011, 03:12 PM
The usual applies:
Is glGetError() detecting any errors?
You mentioned that you are using GL 3.3 and GLSL.
Are you checking to make sure each vertex shader is compiling.
Are you checking to make sure each fragment shader is compiling.
After linking them, are you checking to see if the link succeeded?

As BionicBytes suggested, you might want to show some code.

It is possible that you are setting up something and in its default state, it runs on one machine but on ATI, the default state is not good and the output goes who knows where.

It is also possible that it is a driver bug.

Mooncabbage
11-11-2011, 06:50 PM
Ok, thanks V-Man. The code SHOULD be self checking, and it wasn't spitting out any errors. Anyway I'll post the code:

<div class="ubbcode-block"><div class="ubbcode-header">Click to reveal.. <input type="button" class="form-button" value="Show me!" onclick="toggle_spoiler(this, 'Yikes, my eyes!', 'Show me!')" />]<div style="display: none;">

// ShadedTriangle.cpp
// Our first OpenGL program that will just draw a triangle on the screen.

#include <GLTools.h> // OpenGL toolkit
#include <GLShaderManager.h> // Shader Manager Class

#ifdef __APPLE__
#include <glut/glut.h> // OS X version of GLUT
#else
#define FREEGLUT_STATIC
#include <GL/glut.h> // Windows FreeGlut equivalent
#endif

GLBatch triangleBatch;
GLShaderManager shaderManager;

GLint myIdentityShader;

///////////////////////////////////////////////////////////////////////////////
// Window has changed size, or has just been created. In either case, we need
// to use the window dimensions to set the viewport and the projection matrix.
void ChangeSize(int w, int h)
{
glViewport(0, 0, w, h);
}


///////////////////////////////////////////////////////////////////////////////
// This function does any needed initialization on the rendering context.
// This is the first opportunity to do any OpenGL related tasks.
void SetupRC()
{
// Blue background
glClearColor(0.5f, 0.5f, 0.5f, 1.0f ); // I set this to grey to find the black triangle

shaderManager.InitializeStockShaders();

// Load up a triangle
GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f,
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f };

GLfloat vColors [] = { 1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f };

triangleBatch.Begin(GL_TRIANGLES, 3);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.CopyColorData4f(vColors);
triangleBatch.End();

myIdentityShader = gltLoadShaderPairWithAttributes("ShadedIdentity.vp", "ShadedIdentity.fp", 2,
GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_COLOR, "vColor");
}


///////////////////////////////////////////////////////////////////////////////
// Cleanup
void ShutdownRC()
{
glDeleteProgram(myIdentityShader);
}


///////////////////////////////////////////////////////////////////////////////
// Called to draw scene
void RenderScene(void)
{
// Clear the window with current clearing color
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

glUseProgram(myIdentityShader);
triangleBatch.Draw();

// Perform the buffer swap to display back buffer
glutSwapBuffers();
}


///////////////////////////////////////////////////////////////////////////////
// Main entry point for GLUT based programs
int main(int argc, char* argv[])
{
gltSetWorkingDirectory(argv[0]);

glutInit(&amp;argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
glutInitWindowSize(800, 600);
glutCreateWindow("Shaded Triangle");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);

GLenum err = glewInit();
if (GLEW_OK != err) {
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
return 1;
}

SetupRC();

glutMainLoop();

ShutdownRC();

return 0;
}




// The ShadedIdentity Shader
// ShadedIdentity.vp
// Vertex Shader
// Richard S. Wright Jr.
// OpenGL SuperBible
#version 130

in vec4 vColor;
in vec4 vVertex;

out vec4 vVaryingColor;

void main(void)
{
vVaryingColor = vColor;
gl_Position = vVertex;
}




// The ShadedIdentity Shader
// ShadededIdentity.fp
// Fragment Shader
// Richard S. Wright Jr.
// OpenGL SuperBible
#version 130

out vec4 vFragColor;
in vec4 vVaryingColor;

void main(void)
{
vFragColor = vVaryingColor;
}
[/QUOTE]</div>

I added some error checking code of my own with glGetError(), and it returns GL_NO_ERROR. It's called just before the main loop, after SetupRC().

Mooncabbage
11-12-2011, 03:18 AM
I was very clever and I solved my own problem today! The issue is in one of the provided library functions, CopyColorData4f(). I've had a similar issue with other functions in the library, the solution is to call the function twice. I'm going to look into the source code for that function, but if anyone else has the same problem, that's your solution.