EXTERN_C_ENTER JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGeometryShader4_glProgramParameteriARB(JNIEnv *__env, jclass clazz, jint program, jint pname, jint value) { glProgramParameteriARBPROC glProgramParameteriARB = (glProgramParameteriARBPROC)tlsGetFunction(1113); UNUSED_PARAM(clazz) glProgramParameteriARB(program, pname, value); }
inline void VL_glProgramParameteri(GLuint program, GLenum pname, GLint value) { if (glProgramParameteriARB) glProgramParameteriARB(program, pname, value); else if (glProgramParameteriEXT) glProgramParameteriEXT(program, pname, value); else VL_UNSUPPORTED_FUNC(); }
GLuint LinkShaders3WithGeometryInfo(GLuint vertShader, GLuint geomShader, GLuint fragShader, GLint verticesOut, GLenum inputType, GLenum outputType) { GLuint program = CreateProgram(); GLdouble t0, t1; assert(vertShader || fragShader); if (vertShader) AttachShader(program, vertShader); if (geomShader) { AttachShader(program, geomShader); glProgramParameteriARB(program, GL_GEOMETRY_VERTICES_OUT_ARB, verticesOut); glProgramParameteriARB(program, GL_GEOMETRY_INPUT_TYPE_ARB, inputType); glProgramParameteriARB(program, GL_GEOMETRY_OUTPUT_TYPE_ARB, outputType); } if (fragShader) AttachShader(program, fragShader); t0 = glutGet(GLUT_ELAPSED_TIME) * 0.001; LinkProgram(program); t1 = glutGet(GLUT_ELAPSED_TIME) * 0.001; LinkTime = t1 - t0; /* check link */ { GLint stat; GetProgramiv(program, GL_LINK_STATUS, &stat); if (!stat) { GLchar log[1000]; GLsizei len; GetProgramInfoLog(program, 1000, &len, log); fprintf(stderr, "Shader link error:\n%s\n", log); return 0; } } return program; }
static void init(void) { static const char *fragShaderText = "void main() {\n" " gl_FragColor = gl_Color;\n" "}\n"; static const char *vertShaderText = "void main() {\n" " gl_FrontColor = gl_Color;\n" " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" "}\n"; static const char *geoShaderText = "#version 120\n" "#extension GL_ARB_geometry_shader4 : enable\n" "void main()\n" "{\n" " for(int i = 0; i < gl_VerticesIn; ++i)\n" " {\n" " gl_FrontColor = gl_FrontColorIn[i];\n" " gl_Position = gl_PositionIn[i];\n" " EmitVertex();\n" " }\n" "}\n"; if (!ShadersSupported()) exit(1); if (!glutExtensionSupported("GL_ARB_geometry_shader4")) { printf("This demo requires GL_ARB_geometry_shader4\n"); exit(1); } menu_init(); fragShader = glCreateShader(GL_FRAGMENT_SHADER); load_and_compile_shader(fragShader, fragShaderText); vertShader = glCreateShader(GL_VERTEX_SHADER); load_and_compile_shader(vertShader, vertShaderText); geoShader = glCreateShader(GL_GEOMETRY_SHADER_ARB); if (filename) read_shader(geoShader, filename); else load_and_compile_shader(geoShader, geoShaderText); program = glCreateProgram(); glAttachShader(program, vertShader); glAttachShader(program, geoShader); glAttachShader(program, fragShader); glProgramParameteriARB(program, GL_GEOMETRY_INPUT_TYPE_ARB, GL_LINES_ADJACENCY_ARB); glProgramParameteriARB(program, GL_GEOMETRY_OUTPUT_TYPE_ARB, GL_LINE_STRIP); { int temp; glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB,&temp); glProgramParameteriARB(program,GL_GEOMETRY_VERTICES_OUT_ARB,temp); } glLinkProgram(program); check_link(program); glUseProgram(program); SetUniformValues(program, Uniforms); PrintUniforms(Uniforms); assert(glGetError() == 0); glEnableClientState( GL_VERTEX_ARRAY ); glEnableClientState( GL_COLOR_ARRAY ); glVertexPointer( 3, GL_FLOAT, sizeof(vertices[0]), vertices ); glColorPointer( 4, GL_FLOAT, sizeof(color[0]), color ); }
static void Init(void) { static const char *fragShaderText = "uniform float StipplePattern[16]; \n" "varying float stippleCoord; \n" "void main() \n" "{ \n" " // check the stipple pattern and discard if value is zero \n" " // TODO: we should really undo the perspective interpolation here \n" " // so that it's linear. \n" " float stip = StipplePattern[int(fract(stippleCoord) * 16.0)]; \n" " if (stip == 0.0) \n" " discard; \n" " gl_FragColor = gl_Color; \n" "} \n"; static const char *vertShaderText = "void main() \n" "{ \n" " gl_FrontColor = gl_Color; \n" " gl_Position = ftransform(); \n" "} \n"; static const char *geomShaderText = "#version 120 \n" "#extension GL_ARB_geometry_shader4: enable \n" "uniform vec2 ViewportSize; \n" "uniform float StippleFactor; \n" "varying float stippleCoord; \n" "void main() \n" "{ \n" " vec4 pos0 = gl_PositionIn[0]; \n" " vec4 pos1 = gl_PositionIn[1]; \n" " // Convert eye coords to window coords \n" " // Note: we're off by a factor of two here, make up for that below \n" " vec2 p0 = pos0.xy / pos0.w * ViewportSize; \n" " vec2 p1 = pos1.xy / pos1.w * ViewportSize; \n" " float len = length(p0.xy - p1.xy); \n" " // Emit first vertex \n" " gl_FrontColor = gl_FrontColorIn[0]; \n" " gl_Position = pos0; \n" " stippleCoord = 0.0; \n" " EmitVertex(); \n" " // Emit second vertex \n" " gl_FrontColor = gl_FrontColorIn[1]; \n" " gl_Position = pos1; \n" " stippleCoord = len / StippleFactor / 32.0; // Note: not 16, see above \n" " EmitVertex(); \n" "} \n"; if (!ShadersSupported()) exit(1); if (!glutExtensionSupported("GL_ARB_geometry_shader4")) { fprintf(stderr, "Sorry, GL_ARB_geometry_shader4 is not supported.\n"); exit(1); } VertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText); FragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText); GeomShader = CompileShaderText(GL_GEOMETRY_SHADER_ARB, geomShaderText); assert(GeomShader); Program = LinkShaders3(VertShader, GeomShader, FragShader); assert(Program); CheckError(__LINE__); /* * The geometry shader accepts lines and produces lines. */ glProgramParameteriARB(Program, GL_GEOMETRY_INPUT_TYPE_ARB, GL_LINES); glProgramParameteriARB(Program, GL_GEOMETRY_OUTPUT_TYPE_ARB, GL_LINE_STRIP); glProgramParameteriARB(Program, GL_GEOMETRY_VERTICES_OUT_ARB, 4); CheckError(__LINE__); glLinkProgramARB(Program); /* check link */ { GLint stat; GetProgramiv(Program, GL_LINK_STATUS, &stat); if (!stat) { GLchar log[1000]; GLsizei len; GetProgramInfoLog(Program, 1000, &len, log); fprintf(stderr, "Shader link error:\n%s\n", log); } } glUseProgram(Program); uViewportSize = glGetUniformLocation(Program, "ViewportSize"); uStippleFactor = glGetUniformLocation(Program, "StippleFactor"); uStipplePattern = glGetUniformLocation(Program, "StipplePattern"); glUniform1f(uStippleFactor, StippleFactor); glClearColor(0.3f, 0.3f, 0.3f, 0.0f); printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); assert(glIsProgram(Program)); assert(glIsShader(FragShader)); assert(glIsShader(VertShader)); assert(glIsShader(GeomShader)); glLineStipple(StippleFactor, StipplePattern); SetStippleUniform(StippleFactor, StipplePattern); MakePointsVBO(); }
static void Init(void) { static const char *fragShaderText = "void main() \n" "{ \n" " gl_FragColor = gl_Color; \n" "} \n"; static const char *vertShaderText = "void main() \n" "{ \n" " gl_FrontColor = gl_Color; \n" " gl_Position = ftransform(); \n" "} \n"; static const char *geomShaderText = "#version 120 \n" "#extension GL_ARB_geometry_shader4: enable \n" "uniform vec2 InverseViewportSize; \n" "uniform float LineWidth; \n" "void main() \n" "{ \n" " vec4 pos0 = gl_PositionIn[0]; \n" " vec4 pos1 = gl_PositionIn[1]; \n" " vec4 dir = abs(pos1 - pos0); \n" " vec2 d0 = vec2(LineWidth * pos0.w) * InverseViewportSize; \n" " vec2 d1 = vec2(LineWidth * pos1.w) * InverseViewportSize; \n" " // this conditional could be avoided \n" " if (dir.x > dir.y) { \n" " // X-major line \n" " d0.x = 0.0; \n" " d1.x = 0.0; \n" " } \n" " else { \n" " // Y-major line \n" " d0.y = 0.0; \n" " d1.y = 0.0; \n" " } \n" " gl_FrontColor = gl_FrontColorIn[0]; \n" " gl_TexCoord[0] = vec4(0, 0, 0, 1); \n" " gl_Position = pos0 + vec4( d0.x, -d0.y, 0, 0); \n" " EmitVertex(); \n" " gl_FrontColor = gl_FrontColorIn[1]; \n" " gl_TexCoord[0] = vec4(1, 0, 0, 1); \n" " gl_Position = pos1 + vec4( d1.x, -d1.y, 0, 0); \n" " EmitVertex(); \n" " gl_FrontColor = gl_FrontColorIn[0]; \n" " gl_TexCoord[0] = vec4(0, 1, 0, 1); \n" " gl_Position = pos0 + vec4(-d0.x, d0.y, 0, 0); \n" " EmitVertex(); \n" " gl_FrontColor = gl_FrontColorIn[1]; \n" " gl_TexCoord[0] = vec4(1, 1, 0, 1); \n" " gl_Position = pos1 + vec4(-d1.x, d1.y, 0, 0); \n" " EmitVertex(); \n" "} \n"; if (!ShadersSupported()) exit(1); if (!glutExtensionSupported("GL_ARB_geometry_shader4")) { fprintf(stderr, "Sorry, GL_ARB_geometry_shader4 is not supported.\n"); exit(1); } VertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText); FragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText); GeomShader = CompileShaderText(GL_GEOMETRY_SHADER_ARB, geomShaderText); assert(GeomShader); Program = LinkShaders3(VertShader, GeomShader, FragShader); assert(Program); CheckError(__LINE__); /* * The geometry shader will convert incoming lines to quads (4-vertex * triangle strips). */ glProgramParameteriARB(Program, GL_GEOMETRY_INPUT_TYPE_ARB, GL_LINES); glProgramParameteriARB(Program, GL_GEOMETRY_OUTPUT_TYPE_ARB, GL_TRIANGLE_STRIP); glProgramParameteriARB(Program,GL_GEOMETRY_VERTICES_OUT_ARB, 4); CheckError(__LINE__); glLinkProgramARB(Program); /* check link */ { GLint stat; GetProgramiv(Program, GL_LINK_STATUS, &stat); if (!stat) { GLchar log[1000]; GLsizei len; GetProgramInfoLog(Program, 1000, &len, log); fprintf(stderr, "Shader link error:\n%s\n", log); } } CheckError(__LINE__); glUseProgram(Program); CheckError(__LINE__); uInverseViewportSize = glGetUniformLocation(Program, "InverseViewportSize"); uLineWidth = glGetUniformLocation(Program, "LineWidth"); glClearColor(0.3f, 0.3f, 0.3f, 0.0f); printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); assert(glIsProgram(Program)); assert(glIsShader(FragShader)); assert(glIsShader(VertShader)); assert(glIsShader(GeomShader)); glEnable(GL_DEPTH_TEST); { GLfloat r[2]; glGetFloatv(GL_LINE_WIDTH_RANGE, r); MaxLineWidth = r[1]; } MakePointsVBO(); }
static void prepare_shaders(void) { static const char *fragShaderText = "void main() {\n" " gl_FragColor = gl_Color;\n" "}\n"; static const char *vertShaderText = "void main() {\n" " gl_FrontColor = gl_Color;\n" " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" "}\n"; static const char *geoShaderText = "#version 120\n" "#extension GL_ARB_geometry_shader4 : enable\n" "void main()\n" "{\n" " for(int i = 0; i < gl_VerticesIn; ++i)\n" " {\n" " gl_FrontColor = gl_FrontColorIn[i];\n" " gl_Position = gl_PositionIn[i];\n" " EmitVertex();\n" " }\n" "}\n"; if (!glutExtensionSupported("GL_ARB_geometry_shader4")) { fprintf(stderr, "needs GL_ARB_geometry_shader4 extension\n"); exit(1); } fragShader = glCreateShader(GL_FRAGMENT_SHADER); load_and_compile_shader(fragShader, fragShaderText); vertShader = glCreateShader(GL_VERTEX_SHADER); load_and_compile_shader(vertShader, vertShaderText); geoShader = glCreateShader(GL_GEOMETRY_SHADER_ARB); if (filename) read_shader(geoShader, filename); else load_and_compile_shader(geoShader, geoShaderText); program = glCreateProgram(); glAttachShader(program, vertShader); glAttachShader(program, geoShader); glAttachShader(program, fragShader); glProgramParameteriARB(program, GL_GEOMETRY_INPUT_TYPE_ARB, GL_TRIANGLES); glProgramParameteriARB(program, GL_GEOMETRY_OUTPUT_TYPE_ARB, GL_TRIANGLE_STRIP); { int temp; glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB,&temp); glProgramParameteriARB(program,GL_GEOMETRY_VERTICES_OUT_ARB,temp); } glLinkProgram(program); check_link(program); glUseProgram(program); }