After a discussion in this thread: http://www.opengl.org/discussion_boards/ubb/Forum3/HTML/007950.html
we came to the conclusion that we had found a possible driver bug. Could someone please confirm/deny this?
Here is a simple test program written with glut. It does not check for NV_vertex_program support for brevity, but demonstrates the bug:
//Possible Nvidia driver bug with NV_vertex_program aliased attributes
#include <stdio.h>
#include <GL/glut.h>
#include <GL/glext.h>float vertexPositions={ -1.0f,-1.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
1.0f,-1.0f, 0.0f};PFNGLBINDPROGRAMNVPROC glBindProgramNV;
PFNGLGENPROGRAMSNVPROC glGenProgramsNV;
PFNGLVERTEXATTRIBPOINTERNVPROC glVertexAttribPointerNV;
PFNGLLOADPROGRAMNVPROC glLoadProgramNV;
PFNGLTRACKMATRIXNVPROC glTrackMatrixNV;
GLuint vertexProgram;
void init(void)
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnable(GL_DEPTH_TEST);glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)
wglGetProcAddress(“glBindProgramNV”);
glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)
wglGetProcAddress(“glGenProgramsNV”);
glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC)
wglGetProcAddress(“glVertexAttribPointerNV”);
glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)
wglGetProcAddress(“glLoadProgramNV”);
glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC)
wglGetProcAddress(“glTrackMatrixNV”);
char * programString=“!!VP1.0
DP4 o[HPOS].x, c[0], v[OPOS];
DP4 o[HPOS].y, c[1], v[OPOS];
DP4 o[HPOS].z, c[2], v[OPOS];
DP4 o[HPOS].w, c[3], v[OPOS];
MOV o[COL0], v[COL0];
END”;glGenProgramsNV(1, &vertexProgram);
glBindProgramNV(GL_VERTEX_PROGRAM_NV, vertexProgram);
glLoadProgramNV(GL_VERTEX_PROGRAM_NV, vertexProgram, strlen(programString),
(const unsigned char *)programString);
glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 0, GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV);//glVertexPointer(3, GL_FLOAT, 0, vertexPositions);
//glEnableClientState(GL_VERTEX_ARRAY);
glVertexAttribPointerNV(0, 3, GL_FLOAT, 0, vertexPositions);
glEnableClientState(GL_VERTEX_ATTRIB_ARRAY0_NV);
}void display(void)
{
glEnable(GL_VERTEX_PROGRAM_NV);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_VERTEX_PROGRAM_NV);glLoadIdentity();
glEnable(GL_VERTEX_PROGRAM_NV);
glTranslatef(0.0f, 0.0f, -5.0f);
static float angle=0.0f;
angle+=0.05f;
glRotatef(angle, 0.0f, 0.0f, 1.0f);glDrawArrays(GL_QUADS, 0, 4);
glDisable(GL_VERTEX_PROGRAM_NV);
glFinish();
glutSwapBuffers();
glutPostRedisplay();
}void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, 1.0f, 1.0f, 100.0f);
glMatrixMode(GL_MODELVIEW);
}int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(256, 256);
glutCreateWindow(argv[0]);
init();glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
The program runs fine on my system, displaying a rotating quad as expected.
However, if I remove the Enable/Disable vertex program sandwiching glClear, it crashes the system. It works fine using standard “glVertexPointer” rather than “glVertexAttribPointer(0,”
Is this a driver bug, or have I made a mistake?
[This message has been edited by bakery2k (edited 11-17-2002).]