nV News Forums

 
 

nV News Forums (http://www.nvnews.net/vbulletin/index.php)
-   NVIDIA Linux (http://www.nvnews.net/vbulletin/forumdisplay.php?f=14)
-   -   Problem with glUniform1f in 100.14.11 on 8800GTS (http://www.nvnews.net/vbulletin/showthread.php?t=95980)

AndreasM 08-03-07 01:25 AM

Problem with glUniform1f in 100.14.11 on 8800GTS
 
1 Attachment(s)
For some reason I'm unable to pass floats to shaders. Whatever values i use for the second argument in glUniform1f the float variable it sets inside the shader stays zero. I'm using version 100.14.11 of the drivers on a 8800GTS 320mb.

This test program should draw a yellow triangle, but only draws a green one because glUniform1f fails to set var1 to 1.0.
Code:

#include <GL/gl.h>
#include <GL/glx.h>
#include <stdio.h>
#include <stdlib.h>

GLuint program = 0;

static void redraw( Display *dpy, Window w )
{
  printf("Redraw event\n");

  glClear( GL_COLOR_BUFFER_BIT );

  glTranslatef(-1.5f,0.0f,-6.0f);
  glLoadIdentity();

  glUseProgram(program);

  glUniform1f(glGetUniformLocation(program, "var1"), 1.0f);
  glUniform1i(glGetUniformLocation(program, "var2"), 1);

  glBegin(GL_TRIANGLES);

        glVertex3f( 0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f,-1.0f, 0.0f);
        glVertex3f( 1.0f,-1.0f, 0.0f);

  glEnd();

  glXSwapBuffers( dpy, w );
}



static void resize( unsigned int width, unsigned int height )
{
  printf("Resize event\n");
  glViewport( 0, 0, width, height );
  glMatrixMode( GL_PROJECTION );
  glLoadIdentity();
  glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 );
}



static Window make_rgb_db_window( Display *dpy,
                                  unsigned int width, unsigned int height )
{
  int attrib[] = { GLX_RGBA,
                    GLX_RED_SIZE, 1,
                    GLX_GREEN_SIZE, 1,
                    GLX_BLUE_SIZE, 1,
                    GLX_DOUBLEBUFFER,
                    None };
  int scrnum;
  XSetWindowAttributes attr;
  unsigned long mask;
  Window root;
  Window win;
  GLXContext ctx;
  XVisualInfo *visinfo;

  scrnum = DefaultScreen( dpy );
  root = RootWindow( dpy, scrnum );

  visinfo = glXChooseVisual( dpy, scrnum, attrib );
  if (!visinfo) {
      printf("Error: couldn't get an RGB, Double-buffered visual\n");
      exit(1);
  }

  /* window attributes */
  attr.background_pixel = 0;
  attr.border_pixel = 0;
  attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone);
  attr.event_mask = StructureNotifyMask | ExposureMask;
  mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;

  win = XCreateWindow( dpy, root, 0, 0, width, height,
                        0, visinfo->depth, InputOutput,
                        visinfo->visual, mask, &attr );

  ctx = glXCreateContext( dpy, visinfo, NULL, True );
  if (!ctx) {
      printf("Error: glXCreateContext failed\n");
      exit(1);
  }

  glXMakeCurrent( dpy, win, ctx );

  return win;
}


static void event_loop( Display *dpy )
{
  XEvent event;

  while (1) {
      XNextEvent( dpy, &event );

      switch (event.type) {
        case Expose:
            redraw( dpy, event.xany.window );
            break;
        case ConfigureNotify:
            resize( event.xconfigure.width, event.xconfigure.height );
            break;
      }
  }
}

static const char *shadercode =
"uniform float var1;\
uniform int var2;\
\
void main(void)\
{\
  gl_FragColor = vec4(var1, var2, 0.0, 1.0);\
}";

int main( int argc, char *argv[] )
{
  Display *dpy;
  Window win;
  GLuint shader;

  dpy = XOpenDisplay(NULL);

  win = make_rgb_db_window( dpy, 300, 300 );

  shader = glCreateShader(GL_FRAGMENT_SHADER);

  program = glCreateProgram();

  glShaderSource(shader, 1, &shadercode, NULL);

  glCompileShader(shader);

  glAttachShader(program, shader);

  glLinkProgram(program);
  glDeleteShader(shader);

  XMapWindow( dpy, win );

  event_loop( dpy );
  return 0;
}



All times are GMT -5. The time now is 08:59 AM.

Powered by vBulletin® Version 3.7.1
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Copyright 1998 - 2014, nV News.