You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/3rd/VTK7.1/include/vtkShader2.h

203 lines
5.4 KiB
C

/*=========================================================================
Program: Visualization Toolkit
Module: vtkShader2.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkShader2
* @brief GLSL Shader
*
* A vtkShader2 object is made of a source code encoded into a string and
* a type, identifying the hardware programmable stage it is attached to.
* Hardware programmable stages are (or will be)
* 1. vertex shader
* 2. tessellation control shader
* 3. tessellation evaluation shader
* 4. geometry shader
* 5. fragment shader
*
* Note: tessellation control shader is called hull shader in DirectX11
* Note: tessellation evaluation shader is called domain shader in DirectX11
* Ref: OpenGL spec 4.0
* http://www.opengl.org/registry/doc/glspec40.core.20100311.withchanges.pdf
* Ref: "Introducing DirectX 11"
* http://www.gamasutra.com/view/feature/3759/sponsored_feature_introducing_.php
*
* @sa
* vtkShaderProgram2
*/
#ifndef vtkShader2_h
#define vtkShader2_h
#include "vtkWeakPointer.h" // for ren context
#include "vtkRenderingOpenGLModule.h" // For export macro
#include "vtkObject.h"
// Values for GetType()/SetType()
enum vtkShader2Type
{
VTK_SHADER_TYPE_VERTEX = 0,
VTK_SHADER_TYPE_TESSELLATION_CONTROL = 3, // new, not supported yet
VTK_SHADER_TYPE_TESSELLATION_EVALUATION = 4, // new, not supported yet
VTK_SHADER_TYPE_GEOMETRY = 1,
VTK_SHADER_TYPE_FRAGMENT = 2
};
class vtkRenderWindow;
class vtkUniformVariables;
class VTKRENDERINGOPENGL_EXPORT vtkShader2 : public vtkObject
{
public:
static vtkShader2 *New();
vtkTypeMacro(vtkShader2,vtkObject);
void PrintSelf(ostream &os, vtkIndent indent);
/**
* Returns if the context supports the required extensions.
* Extensions are load when the context is set.
*/
static bool IsSupported(vtkRenderWindow *context);
//@{
/**
* String containing the shader source code. Reminder SetString makes a copy
* of its argument.
*/
vtkGetStringMacro(SourceCode);
vtkSetStringMacro(SourceCode);
//@}
//@{
/**
* Return the shader type, .
* \post valid_result: result==VTK_SHADER_TYPE_VERTEX ||
* result==VTK_SHADER_TYPE_TESSELLATION_CONTROL ||
* result==VTK_SHADER_TYPE_TESSELLATION_EVALUATION ||
* result==VTK_SHADER_TYPE_GEOMETRY ||
* result==VTK_SHADER_TYPE_FRAGMENT.
*/
vtkGetMacro(Type,int);
//@}
//@{
/**
* Set the shader type, .
* \pre valid_type: type==VTK_SHADER_TYPE_VERTEX ||
* type==VTK_SHADER_TYPE_TESSELLATION_CONTROL ||
* type==VTK_SHADER_TYPE_TESSELLATION_EVALUATION ||
* type==VTK_SHADER_TYPE_GEOMETRY ||
* type==VTK_SHADER_TYPE_FRAGMENT.
* \post is_set: GetType()==type.
*/
vtkSetMacro(Type,int);
//@}
/**
* Return the shader type as a string.
*/
const char *GetTypeAsString();
/**
* Compile the shader code.
* The result of compilation can be query with GetLastCompileStatus()
* The log of compilation can be query with GetLastCompileLog()
* \pre SourceCode_exists: this->GetSourceCode()!=0
*/
void Compile();
/**
* Tells if the last call to compile succeeded (true) or not (false).
* Initial value is false.
*/
bool GetLastCompileStatus();
/**
* Return the log of the last call to compile as a string.
* Initial value is the empty string ""='\0'.
* \post result_exists: result!=0
*/
const char *GetLastCompileLog();
//@{
/**
* Get/Set the context. This does not increase the reference count of the
* context to avoid reference loops.
* SetContext() may raise an error is the OpenGL context does not support the
* required OpenGL extensions.
*/
void SetContext(vtkRenderWindow *context);
vtkRenderWindow *GetContext();
//@}
/**
* Release OpenGL resource (shader id).
*/
virtual void ReleaseGraphicsResources();
//@{
/**
* Return the OpenGL shader object id.
*/
vtkGetMacro(Id,unsigned int);
//@}
//@{
/**
* Get/Set the list of uniform variables values.
* Initial value is an empty list (not null pointer).
*/
vtkGetObjectMacro(UniformVariables,vtkUniformVariables);
virtual void SetUniformVariables(vtkUniformVariables *variables);
//@}
protected:
/**
* Default constructor. SourceCode is NULL. Type is vertex.
*/
vtkShader2();
/**
* Destructor. Delete SourceCode and LastCompileLog if any.
*/
virtual ~vtkShader2();
/**
* Load the required OpenGL extensions.
*/
bool LoadRequiredExtensions(vtkRenderWindow *context);
char *SourceCode;
int Type;
unsigned int Id; // actually GLuint. Initial value is 0.
bool LastCompileStatus; // Initial value is false.
char *LastCompileLog; // Initial value is the empty string ""='\0'.
size_t LastCompileLogCapacity; // Initial value is 8.
vtkTimeStamp LastCompileTime;
vtkUniformVariables *UniformVariables; // Initial values is an empty list
vtkWeakPointer<vtkRenderWindow> Context;
bool ExtensionsLoaded;
bool SupportGeometryShader;
private:
vtkShader2(const vtkShader2&) VTK_DELETE_FUNCTION;
void operator=(const vtkShader2&) VTK_DELETE_FUNCTION;
};
#endif