hi all,
i am working on a volume rendering project for that i need to implement raycasting algorithm, but my shaders are behaving strangely…problem is that i m not able to send my volume_data & transfer_func textures to my fragment shaders properly…here is the code where i m sending these samplers to shader
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_3D, volume_texture);
glUseProgram(p);
parameterLocation = glGetUniformLocation(p,"volumeData");
glUniform1i(parameterLocation,0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_1D, tf_texture);
glUseProgram(p);
parameterLocation = glGetUniformLocation(p,"transferFunction");
glUniform1i(parameterLocation, 1);
i tried to experiment with glActiveTexture i.e i tried to change n in GL_TEXTUREn and shader validator show errors for different textures i.e. in present configuration it shows following error
Program 3 linker: Validation warning! - Sampler value volumeData has not been set in fragment shader
Validation successful.
if i reverse the values it will show same error for transferfunction…
here is my fragment shader…
uniform sampler3D volumeData;
uniform sampler1D transferFunction;
varying vec3 texCoord;
uniform vec3 xCameraPosition;
uniform vec3 bboxMin;
uniform vec3 bboxMax;
uniform float step;
uniform int steps;
uniform vec3 bgColor;
void main(void)
{
vec3 rayOrigin = texCoord;
vec3 rayDir = normalize(rayOrigin - xCameraPosition);
vec3 position = rayOrigin;
vec4 finalColor = vec4(0.0, 0.0, 0.0, 0.0);
vec3 zarroVector = vec3(0, 0, 0);
for (int i = 0; i < steps; ++i)
{
position += step * rayDir;
if (any(greaterThan(position, bboxMax)) || any(lessThan(position, bboxMin)))
{
break;
}
float density = texture3D(volumeData, position).r;
vec4 color = texture1D(transferFunction, density);
finalColor += vec4(color.rgb * (1.0 - color.a) * step, color.a);
if (finalColor.a > .6)
{
break;
}
}
gl_FragColor = vec4(finalColor.rgb * finalColor.a + (1.0 - finalColor.a) * bgColor, 1.0);
}
here is where i am validating my program…
static void validateProgram(GLuint program) {
const unsigned int BUFFER_SIZE = 1024;
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
GLsizei length = 0;
memset(buffer, 0, BUFFER_SIZE);
glGetProgramInfoLog(program, BUFFER_SIZE, &length, buffer);
if (length > 0)
cout << "Program " << program << " linker: " << buffer << endl;
glValidateProgram(program);
GLint status;
glGetProgramiv(program, GL_VALIDATE_STATUS, &status);
if (status == GL_FALSE)
cout << "Error validating shader : returned false" << program << endl;
}
My graphic card is ATI radeon 5470 HD mobility and it supports shader model 3.0 and opengl 3.2…please help as i m stuck very badly…
thank you