35 #include <vtkShaderProgram.h> 36 #include <vtkShader.h> 37 #include <vtkOpenGLHelper.h> 38 #include <vtkOpenGLVertexArrayObject.h> 39 #include <vtkOpenGLBufferObject.h> 40 #include <vtkTextureObject.h> 41 #include <vtkOpenGLIndexBufferObject.h> 42 #include <vtkOpenGLRenderWindow.h> 73 void ShaderCallback::printDebugInfo(vtkOpenGLHelper *OpenGLHelper)
80 vtkShaderProgram *program = OpenGLHelper->Program;
81 std::cout <<
"Program is compiled? " << program->GetCompiled() << std::endl;
82 std::cout <<
"Program is bound? " << program->isBound() << std::endl;
83 std::cout <<
"IBO index count " << OpenGLHelper->IBO->IndexCount << std::endl;
84 std::string vertexshader = program->GetVertexShader()->GetSource();
85 std::cout <<
"Vertexshader:\n " << vertexshader << std::endl;
86 std::string fragmentshader = program->GetFragmentShader()->GetSource();
87 std::cout <<
"Fragmentshader:\n " << fragmentshader << std::endl;
95 vtkOpenGLHelper *OpenGLHelper =
reinterpret_cast<vtkOpenGLHelper*
>(cbo);
97 if(!OpenGLHelper || !OpenGLHelper->VAO || !OpenGLHelper->Program)
103 if(eventId == vtkCommand::UpdateShaderEvent)
112 if(textures_to_add != 0)
114 this->bindFSOutputVariable(OpenGLHelper->Program);
120 OpenGLHelper->VAO->Bind();
123 for(
int i=0; i< textures_to_add; ++i)
129 if(texture_coordinates)
131 if(!texture_coordinates->Bind())
136 this->addArrayToAttributeArray(OpenGLHelper->Program, texture_coordinates, VS_In_Vec3_TextureCoordinate, i);
151 this->addUniformiArray(OpenGLHelper->Program, getVectorNameFromName(FS_Uniform_3DTexture_Volume, i), texture->GetTextureUnit());
166 this->addUniformiArray(OpenGLHelper->Program, getVectorNameFromName(FS_Uniform_1DTexture_LUT, i), lut->GetTextureUnit());
175 this->addUniformfArray(OpenGLHelper->Program, getVectorNameFromName(FS_Uniform_Window,i), shaderItem->mWindow);
176 this->addUniformfArray(OpenGLHelper->Program, getVectorNameFromName(FS_Uniform_Level,i), shaderItem->mLevel);
177 this->addUniformfArray(OpenGLHelper->Program, getVectorNameFromName(FS_Uniform_LLR,i), shaderItem->mLLR);
178 this->addUniformfArray(OpenGLHelper->Program, getVectorNameFromName(FS_Uniform_Alpha,i), shaderItem->mAlpha);
190 for(
int i=0; i<mShaderItems.size(); ++i)
192 item = mShaderItems.at(i);
194 if(item->mTextureUid == image_uid)
206 return mShaderItems.size();
211 mShaderItems.push_back(item);
216 mShaderItems.clear();
227 void ShaderCallback::addArrayToAttributeArray(vtkShaderProgram *program,
vtkOpenGLBufferObjectPtr buffer, std::string name,
int vector_index)
233 size_t stride =
sizeof(float)*vec_size;
234 int elementType = GL_FLOAT;
235 bool normalize =
false;
240 const GLchar *namePtr =
static_cast<const GLchar *
>(name.c_str());
241 GLint start_of_vector_index = glGetAttribLocation(program->GetHandle(), namePtr);
245 if(start_of_vector_index != -1)
247 GLint position_in_vector_index = start_of_vector_index + vector_index;
250 glEnableVertexAttribArray(position_in_vector_index);
252 glVertexAttribPointer(position_in_vector_index,
256 static_cast<GLsizei>(stride),
257 ((
char *)NULL + (offset))
263 CX_LOG_ERROR() <<
"Error setting attribute " << name <<
" with vector_index " << vector_index;
268 void ShaderCallback::addUniformiArray(vtkShaderProgram *program, std::string name,
int value)
274 if(!program->SetUniform1iv(name.c_str(), 1, &value))
276 CX_LOG_ERROR() <<
"Could not set uniform named " << name;
282 void ShaderCallback::addUniformfArray(vtkShaderProgram *program, std::string name,
float value)
288 if(!program->SetUniform1fv(name.c_str(), 1, &value))
290 CX_LOG_ERROR() <<
"Could not set uniform named " << name;
296 void ShaderCallback::bindFSOutputVariable(vtkShaderProgram *program)
298 GLint color_frag_out_index = glGetFragDataLocation(program->GetHandle(), FS_Out_Vec4_Color.c_str());
300 if(color_frag_out_index != -1)
302 glBindFragDataLocation(program->GetHandle(), color_frag_out_index, FS_Out_Vec4_Color.c_str());
307 CX_LOG_ERROR() <<
"Could not find glGetFragDataLocation for " << FS_Out_Vec4_Color;
311 std::string ShaderCallback::getVectorNameFromName(std::string name,
int index_of_vector)
const 313 QString fullName = QString(
"%1[%2]").arg(QString(name.c_str())).arg(index_of_vector);
314 return fullName.toStdString();
vtkSmartPointer< class vtkTextureObject > vtkTextureObjectPtr
virtual void Execute(vtkObject *, unsigned long eventId, void *cbo)
virtual ~ShaderCallback()
vtkSmartPointer< class vtkOpenGLBufferObject > vtkOpenGLBufferObjectPtr
The ShaderCallback class is used to update information sent to our custom OpenGL shaders.
int getNumberOfUploadedTextures() const
boost::shared_ptr< ShaderItem > ShaderItemPtr
static ShaderCallback * New()
void add(ShaderItemPtr item)
ShaderItemPtr getShaderItem(QString image_uid) const
#define report_gl_error()
Namespace for all CustusX production code.