Cg c for graphics
This presentation is the property of its rightful owner.
Sponsored Links
1 / 38

Cg: C for Graphics PowerPoint PPT Presentation


  • 80 Views
  • Uploaded on
  • Presentation posted in: General

Cg: C for Graphics. Jon Moon Based on slides by Eugene Lee. Overview. Cg Basics Vertex Shaders Fragment Shaders Using Cg in OpenGL. What is Cg?. Cg is a high level shader language Made by NVIDIA, but supports other GPUs Programmer writes in a language similar to C

Download Presentation

Cg: C for Graphics

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Cg c for graphics

Cg: C for Graphics

Jon Moon

Based on slides by Eugene Lee


Overview

Overview

  • Cg Basics

  • Vertex Shaders

  • Fragment Shaders

  • Using Cg in OpenGL


What is cg

What is Cg?

  • Cg is a high level shader language

    • Made by NVIDIA, but supports other GPUs

    • Programmer writes in a language similar to C

    • Cg compiler produces hardware-specific optimized assembly code


Halflife 1 vs halflife 2

Halflife 1 vs. Halflife 2


Http www daionet gr jp masa rthdribl index html

http://www.daionet.gr.jp/~masa/rthdribl/index.html


Overview1

Overview

  • Motivation

  • Vertex Shaders

  • Fragment Shaders

  • Using Cg in OpenGL

  • Questions?


The vertex shader

The Vertex Shader

  • Program executed once per vertex

  • Takes per-vertex input such as position, normal, color, light position, etc.

  • Determines per-vertex data such as position, color, depth, etc.

    • But can do more!


The vertex shader1

The Vertex Shader


A vertex program

A Vertex Program

struct VertexInput {

float4 position : POSITION;

float3 normal : NORMAL;

}

void NormalShade( VertexInput input,

out float4 outPosition : POSITION,

out float3 outColor : COLOR,

const uniform float4x4 modelViewProjMatrix)

{

outPosition = mul(modelViewProjMatrix, input.position);

outColor = abs(input.normal);

}


Binding semantics

Binding Semantics

  • Predefined “names”

  • POSITION, NORMAL, etc.

struct VertexInput {

float4 position : POSITION;

float3 normal : NORMAL;

}

void NormalShade(VertexInput input,

out float4 outPosition : POSITION,

out float3 outColor : COLOR,

const uniform float4x4 modelViewProjMatrix) {

outPosition = mul(modelViewProjMatrix, input.position);

outColor = abs(input.normal);

}


Vertex shader input

Vertex Shader: Input

  • Varying parameters

    • Color, normal, texture coordinates, etc.

    • Data specified for each element

glBegin(GL_TRIANGLES);

glColor3f(1.0f, 0.0f, 0.0f);

glNormal3f(0.0f, 1.0f, 0.0f);

glVertex3f(1.0f, 1.0f, 1.0f);

//...

glEnd();

void Shade(float3 color : COLOR,

float3 normal : NORMAL,

float3 position : POSITION,...) {

//...

}

OpenGL

CG Vertex Program


Vertex shader input1

Vertex Shader: Input

  • Uniform Parameters

    • Data that remains constant over each element

    • Parameter shadowing

cgSetParameter3f(kdParam, 0.3f, 0.2f, 0.6f)

glBegin(GL_TRIANGLES);

//...

glEnd();

void Shade(..., const uniform float3 kd) {

//...

}

OpenGL

CG Vertex Program


Vertex shader output

Vertex Shader: Output

  • Output serves as varying input to fragments

  • “Custom data” usually output as texcoords

struct VertexInput {

float4 position : POSITION;

float3 normal : NORMAL;

}

void NormalShade(VertexInput input,

out float4 outPosition : POSITION,

out float3 outColor : COLOR,

const uniform float4x4 modelViewProjMatrix) {

outPosition = mul(modelViewProjMatrix, input.position);

outColor = abs(input.normal);

}


Types in cg

Types in Cg

  • Syntax similar to C

  • Basic types

    • int, float, half, fixed, bool

  • Vector/Matrix types

    • int4, float3, bool2, float4x4

  • Arrays

    • int a[3], float4x4 matrices[4][4]


Playing with types

Playing with types

  • Vector initialization and swizzling

    • float4 vec4 = float4(1, 1, 1, 0);

    • float3 vec3 = vec4.yzw;

    • float3 color = vec3.rgb;

    • float3 position = 1.xxx;


Overview2

Overview

  • Motivation

  • Vertex Shaders

  • Fragment Shaders

  • Using Cg in OpenGL

  • Questions?


The fragment shader

The Fragment Shader

  • Program executed once per rasterized pixel.

  • Takes varying output from vertex program.

    • Certain outputs, like TEXCOORD0 interpolated.

  • Determines final color, depth for pixel.


The fragment shader1

The Fragment Shader


A fragment program

A Fragment Program

float3 SinWave(float3 tex : TEXCOORD0) : COLOR {

return sin(tex.x);

}


A fragment program1

A Fragment Program

void PerPixelLight(float3 position : TEXCOORD0,

float3 normal : TEXCOORD1,

const uniform float3 eye,

const uniform float3 light) {

float3 L = normalize(light – position);

float3 V = normalize(eye – position);

outColor = computeRd(L, N) + computeRs(L, V, N);

}


Performance

Performance

  • Fragment Programs are Expensive!

    • Try to do as much as possible in vertex programs.

    • Try to keep fragment programs small.

  • Note: not all hardware supports fragments

    • Rhodes 453 has Quadro FX GPU’s, which DO support fragment programs


Overview3

Overview

  • Motivation

  • Vertex Shaders

  • Fragment Shaders

  • Using Cg in OpenGL

  • Questions?


Initializing cg

Initializing Cg

  • Create a context

    • CGcontext cgContext = CgGL.cgCreateContext();

  • Select and enable Profile

    • int cgVertexProfile = CgGL.CG_PROFILE_VP20;

    • CgGL.cgGLEnableProfile(cgVertexProfile);

  • Create & Load program

    • CGprogram cgVertexProgram = CgGL.cgCreateProgramFromFile(cgContext, CgGL.CG_SOURCE, "Normal.cg", cgVertexProfile, "Normal", null);

    • CgGL.cgGLLoadProgram(cgVertexProgram1);


Executing cg

Executing Cg

  • Get handles for parameters

    • CGparameter mvpMatrix = CgGL.cgGetNamedParameter(cgVertexProgram, “ModelViewProjMatrix”);

  • Set parameters

    • CgGL.cgGLSetStateMatrixParameter( mvpMatrix, CgGL.CG_GL_MODELVIEW_PROJECTION_MATRIX, CgGL.CG_GL_MATRIX_IDENTITY)

  • Bind program

    • CgGL.CgGLBindProgram(cgVertexProgram);

  • Rendering

    • glBegin()…


Cg in action normal shader

Cg in Action: Normal Shader

  • First demo: using 1 vertex shader to shade a cube based on its normal

  • Based on OpenGLDemo02 from last week

  • First look at Normal.cg, then at the Java code to actually use it


Normal cg

Normal.cg

struct VertexInput {

float4 position: POSITION;

float3 normal: NORMAL;

};

struct VertexOutput {

float4 position: POSITION;

float3 color: COLOR0;

};

VertexOutput Normal(const VertexInput input,

const uniform float4x4 ModelViewProjMatrix) {

VertexOutput output;

output.position = mul(ModelViewProjMatrix, input.position);

output.color = (input.normal+1)/2;

return output;

}


Vertex java declarations

Vertex.java: declarations

protected CGcontext cgContext;

protected int cgVertexProfile;

protected static CGprogram cgVertexProgram;

protected static CGparameter cgModelViewProjMatrix;


Vertex java initializations

Vertex.java: initializations

cgContext = CgGL.cgCreateContext();

cgVertexProfile = CgGL.CG_PROFILE_VP20;

CgGL.cgGLEnableProfile( cgVertexProfile);

cgVertexProgram = CgGL.cgCreateProgramFromFile( cgContext, CgGL.CG_SOURCE, "Normal.cg", cgVertexProfile, "Normal", null);

CgGL.cgGLLoadProgram(cgVertexProgram);

cgModelViewProjMatrix = CgGL.cgGetNamedParameter( cgVertexProgram, "ModelViewProjMatrix");


Vertex java display loop

Vertex.java: Display loop

CgGL.cgGLBindProgram(cgVertexProgram);

CgGL.cgGLSetStateMatrixParameter( cgModelViewProjMatrix, CgGL.CG_GL_MODELVIEW_PROJECTION_MATRIX, CgGL.CG_GL_MATRIX_IDENTITY);


More than 1 vertex program

More than 1 Vertex Program

  • Can use different vertex (fragment) programs for different geometry!

  • Initialize programs as you would normally

    • 1 context, 1 vertex profile, many programs, many loads, etc.

  • In display loop, bind appropriate VP before gl_Begin() … gl_End().

  • To use another VP, simply bind to it before the next gl_Begin() … gl_End().


Twovertex java

TwoVertex.java

  • Code very similar to Vertex.java

  • We load the pastel normal shader for the front and back faces, then load the bright normal shader for the rest of the cube

  • Note that we needed to gl_End() after the first 2 faces, then bind our next VP, then gl_Begin(GL_QUADS) again


Sinwave cg

SinWave.cg

float3 SinWave(float3 tex : TEXCOORD0) : COLOR {

return (sin(sin(23*tex.x*tex.y)-10*tex.y)+1)/2;

}

  • This shader is just using the texture coordinates, and some math.

  • Like position and normal, these are made available by OpenGL automatically

    • But if SinWave needed other parameters, we would obtain and modify them as usual.


Fragment java declaration init

Fragment.java: declaration, init

  • Very similar to Vertex, except with all “vertex”es replaced with “fragment”s

  • We make sure to specify the texture coordinates for the corners of each face

    • Texture coords are interpolated across polygons, so fragment programs can use them readily


Lambertian a la pa1

Lambertian, a la PA1

  • Vertex program finds the normal and light vectors in world space, outputting those as COLOR0, COLOR1

  • Fragment program gets interpolated normal, light vector for each pixel and calculates lighting


Lambertian java

Lambertian.java

  • Does standard declare, init:

    • 1 context, 2 profiles (create, enable), 2 programs (create, load)

    • Gets, sets all necessary variables for both programs

    • In display loop, bind both VP and FP

    • That’s it!


Some tips

Some Tips

  • Check for errors!

    • CgErrorException.checkCgError();

    • Debug output in shaders

    • Normals, incident directions, different terms in BRDFs, etc.

  • Can compile .cg programs

    • cgc –profile vp20 –entry (function name) Program.cg


Pa1 cg shaders portion

PA1: Cg Shaders portion

  • Write a couple of shading models

  • Must set the input parameters to cg programs.

  • Reference Lambertian shader code provided


Resources

Resources

  • NVIDIA Cg:

    • http://developer.nvidia.com/page/cg_main.html

  • Cg User Manual:

    • http://developer.nvidia.com/object/cg_users_manual.html

    • Also in Cg Toolkit folder

  • http://www.cgshaders.org


  • Login