Jump to content
  • Advertisement
Sign in to follow this  
appleGuy

OpenGL OpenGL Shader Basics

This topic is 4189 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, Ive done a vertex and fragmemnt shader in render monkey. Imported the shade (copy and paste) into a resource file in vs2005 and tried to use it in a very basic way. The Program compiles however the shader doesnt seem to be applied at all. The shader specic code in the app is: #define GLEW_STATIC #include <GL/glew.h> GLhandleARB v, f, p; glewInit(); if(GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader){ v = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); f = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); const char *vv = readFile("lambert.vert"); const char *ff = readFile("lambert.frag"); if( vv != NULL && ff != NULL){ glShaderSourceARB(v, 1, &vv, NULL); glShaderSourceARB(f, 1, &ff, NULL); glCompileShaderARB(v); glCompileShaderARB(f); delete [] vv; delete [] ff; p = glCreateProgramObjectARB(); glAttachObjectARB(p, v); glAttachObjectARB(p, f); glLinkProgramARB(p); glUseProgramObjectARB(p); glUniform1iARB(glGetUniformLocationARB(p, "cloudTexture"), 0); glUniform4fARB(glGetUniformLocationARB(p, "shaderAmbient"), 1.0f, 0.5f, 0.5f, 1.0f); glUniform4fARB(glGetUniformLocationARB(p, "shaderDiffuse"), 1.0f, 0.5f, 0.5f, 1.0f); glUniform3fARB(glGetUniformLocationARB(p, "lightPos"), 25.0f, 50.0f, -15.0f); } } In Draw Loop: glUseProgramObjectARB(p); glActiveTextureARB(GL_TEXTURE0_ARB); //Draw Object to be shaded etc glUseProgramObjectARB(NULL); //Other Studd using legacy pipelinethe shaders work find in render monkey so its not the actual shaders (i dont think) frag shader: uniform vec4 shaderDiffuse; uniform vec4 shaderAmbient; //Link from vertex shader holds texture coords varying vec2 texCoord; //Link to <-vertexLight varying vec3 lightDirection; varying vec3 normal; //Cloud Texture Access (2d texture) uniform sampler2D cloudTexture; void main(void) { //Dot Light Direction with normalDirection (Facing Ratio) //Need to normalise to get value between 0->1 to get different diffuse values float facingRatio = dot(normalize(normal), normalize(lightDirection)); vec4 diffuseColour = texture2D(cloudTexture,texCoord); vec4 light1 = (diffuseColour * shaderDiffuse * facingRatio); gl_FragColor = light1 + (shaderAmbient * diffuseColour); } vertex shader: //The Shader works per vertex //Used to pass through fixed pipeline to fragment shader varying vec2 texCoord; varying vec3 normal; //Artist Tools uniform vec3 lightPos; //Light Vector varying vec3 lightDirection; void main(void) { //Apply fixed pipeline vertex transformations gl_Position = ftransform(); //Multi texture coordinate for texture 0 texCoord = gl_MultiTexCoord0.xy; //Get Current Vertex Position (to subtract from lightPos to get the vector) //Mulitply my modelview to put vetex position into world coordinates vec4 objectPos = gl_ModelViewMatrix * gl_Vertex; //Apply the light position into the world space (convert to vec4 w = 1) //Finds <-vertexLight lightDirection = (gl_ModelViewMatrix * vec4(lightPos, 1)).xyz - objectPos.xyz; //Set Model Normals to be pass to fragment shader normal = gl_NormalMatrix * gl_Normal; }Im using glew, visualc++ (visual studio 2005) My gpu supports the latest shaders and gl2.0+ Does something need to be set for glew etc to work in vs2005 or is my code wrong. Ive set up glew in the linker and in the lib and include sections of vs Many Thanks For Your help this has been bugging me for a couple of days now Cheers -Alex

Share this post


Link to post
Share on other sites
Advertisement
Use source tags with [] around source...

I am assuming this project compiles fine? No errors? Any errors from GL about the GLSL code? Have you checked to make sure there is no crap at the end of the text files after the last set of brackets?

Share this post


Link to post
Share on other sites
Hi,

thanks for the tip.

No crap at the end of the shader files.

However i did run a an error check using glGetError()

I get a return value of 1280.

After looking it up it is a GL_INVALID_ENUM.

What does this mean?

Thanks For Your Help
-Alex

Share this post


Link to post
Share on other sites
GL_INVALID_ENUM means a lot of things, try to find out, which line generates the Error.

Just check after each line with GLenum vars, the glGetError().

Say which line generates the error, i say you why it is ;)

Share this post


Link to post
Share on other sites
well the 1280 error generates before glewInit()...so before any of the shader stuff

then i get a 1282 after glUseProgramObjectARB(p) which i think is an GL_INVALID_OPERATION

all the glUniform also have a 1282 but i think that is because of the glUseProgramObjectARB(p) error

I also get a 1282 after glUseProgramObjectARB(p) in the main draw loop

Thanks
-Alex

Share this post


Link to post
Share on other sites
Grab the output of glGetShaderInfoLog() after compiling and glGetProgramInfoLog() after linking. Those are usually your first stop for shader problems, they have quite verbose output.

Usage (my Java code):


// create and compile
shaderID = GL20.glCreateShader(type);
GL20.glShaderSource(shaderID, sourceBuffer);
GL20.glCompileShader(shaderID);

// check for error
IntBuffer error = BufferUtils.createIntBuffer(1);
GL20.glGetShader(shaderID, GL20.GL_COMPILE_STATUS, error);
if( error.get() == GL11.GL_FALSE) {
Kernel.log("Could not compile shader: " + filename);

// print error from info log
IntBuffer length = BufferUtils.createIntBuffer(1);
GL20.glGetShader(shaderID, GL20.GL_INFO_LOG_LENGTH, length);
ByteBuffer infoLog = BufferUtils.createByteBuffer(300);
GL20.glGetShaderInfoLog(shaderID, length, infoLog);
Kernel.log(StringHelper.byteBufferToString(infoLog));
Kernel.shutdown(1);
}



I'm not 100% sure but you are using texCoord = gl_MultiTexCoord0.xy; in a way I've not encountered before, in the vertex shader. Not sure if it gets interpolated correctly. Also you're not using OpenGL lighting variables (RenderMonkey really needs to provide support for those, it's a joke not to have them. Bad ATI) but it does seem like you set every variable you needed to for your own lighting.

Share this post


Link to post
Share on other sites
Ok from the a call after vertex shader compile:

"Vertex shader failed to compile with the following errors:
ERROR: 0:35: '<' : syntax error parse error
ERROR: 1 compilation errors. No code generated."

from fragment shader compile:

"Fragment shader failed to compile with the following errors:
ERROR: 0:30: '<' : syntax error parse error
ERROR: 1 compilation errors. No code generated."

from the linker:

"Vertex and Fragment shader(s) were not successfully compiled before glLinkProgram() was called. Link failed."

so oviously is the shaders not the implementation.

Help...lol?

Cheers
Alex

Share this post


Link to post
Share on other sites
That character only appears in your comments, so I guess it's trying to parse those for some reason... maybe there's a problem with your readFile() routine. Before you go changing it, try testing with simpler shaders, like these ones:

vert shader:

void main()
{
gl_Position = ftransform();
}




frag shader:

void main()
{
gl_FragColor = vec4( 0.2, 0.7, 0.2, 1.0 );
}

Share this post


Link to post
Share on other sites
well even with the basic shader:

frag:
void main(void)
{
gl_FragColor = vec4( 0.4, 0.0, 0.9, 1.0 );
}

vert:
void main(void)
{
gl_Position = ftransform();
}

im getting a similar error but with a different number before the '<':
"Vertex shader failed to compile with the following errors:
ERROR: 0:4: '<' : syntax error parse error
ERROR: 1 compilation errors. No code generated."


my read file code is here:

char* readFile(char *fileName){
int fileLength;
char *buffer;

ifstream file;
file.open(fileName, std::ios::binary);

if(!file.is_open())
return NULL;

//Seek to end of file to find length
file.seekg(0, std::ios::end);
fileLength = file.tellg();
//Seek back to begin
file.seekg(0, std::ios::beg);

//Allocate memory to buffer now know length
buffer = new char[fileLength];

//read file into buffer
file.read(buffer, fileLength);

//close the file and return buffer
file.close();
return buffer;
}

Share this post


Link to post
Share on other sites
After looking at what was returned its got crap at the end of it:

‡readFile returned 0x00565b78
"void main(void)
{
gl_FragColor = vec4( 0.4, 0.0, 0.9, 1.0 );
}
ýýýý««««««««îþîþîþ"


what the heck is going on?

cheers
Alex

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!