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.

137 lines
4.7 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkOpenGLRenderUtilities.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 vtkOpenGLRenderUtilities
* @brief OpenGL rendering utility functions
*
* vtkOpenGLRenderUtilities provides functions to help render primitives.
*
* See also the vtkOpenGLQuadHelper class which may be easier to use.
*
*/
#ifndef vtkOpenGLRenderUtilities_h
#define vtkOpenGLRenderUtilities_h
#include "vtkObject.h"
#include "vtkRenderingOpenGL2Module.h" // For export macro
#include "vtk_glew.h" // Needed for GLuint.
#include <string> // for std::string
class vtkOpenGLBufferObject;
class vtkOpenGLRenderWindow;
class vtkOpenGLVertexArrayObject;
class vtkShaderProgram;
class VTKRENDERINGOPENGL2_EXPORT vtkOpenGLRenderUtilities : public vtkObject
{
public:
vtkTypeMacro(vtkOpenGLRenderUtilities, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@{
/**
* Helper function that draws a quad on the screen
* at the specified vertex coordinates and if
* tcoords are not NULL with the specified
* texture coordinates.
*/
static void RenderQuad(
float* verts, float* tcoords, vtkShaderProgram* program, vtkOpenGLVertexArrayObject* vao);
static void RenderTriangles(float* verts, unsigned int numVerts, GLuint* indices,
unsigned int numIndices, float* tcoords, vtkShaderProgram* program,
vtkOpenGLVertexArrayObject* vao);
//@}
//@{
/**
* Draw a full-screen quad:
*
* * VertexShader and GeometryShader should be used as-is when building the
* ShaderProgram.
* * FragmentShaderTemplate supports the replacements //VTK::FSQ::Decl and
* //VTK::FSQ::Impl for declaring variables and the shader body,
* respectively.
* * The varying texCoord is available to the fragment shader for texture
* lookups into full-screen textures, ie. texture2D(textureName, texCoord).
* * PrepFullScreenVAO initializes a new VAO for drawing a quad.
* * DrawFullScreenQuad actually draws the quad.
* Example usage:
* @code
* typedef vtkOpenGLRenderUtilities GLUtil;
* // Prep fragment shader source:
* std::string fragShader = GLUtil::GetFullScreenQuadFragmentShaderTemplate();
* vtkShaderProgram::Substitute(fragShader, "//VTK::FSQ::Decl",
* "uniform sampler2D aTexture;");
* vtkShaderProgram::Substitute(fragShader, "//VTK::FSQ::Impl",
* "gl_FragData[0] = texture2D(aTexture, texCoord);");
* // Create shader program:
* vtkShaderProgram *prog = shaderCache->ReadyShaderProgram(
* GLUtil::GetFullScreenQuadVertexShader().c_str(),
* fragShader.c_str(),
* GLUtil::GetFullScreenQuadGeometryShader().c_str());
* // Initialize new VAO/vertex buffer. This is only done once:
* vtkNew<vtkOpenGLVertexArrayObject> vao;
* GLUtil::PrepFullScreenVAO(renWin, vao.Get(), prog);
* // Setup shader program to sample vtkTextureObject aTexture:
* aTexture->Activate();
* prog->SetUniformi("aTexture", aTexture->GetTextureUnit());
* // Render the full-screen quad:
* vao->Bind();
* GLUtil::DrawFullScreenQuad();
* vao->Release();
* aTexture->Deactivate();
* @endcode
*/
static std::string GetFullScreenQuadVertexShader();
static std::string GetFullScreenQuadFragmentShaderTemplate();
static std::string GetFullScreenQuadGeometryShader();
static bool PrepFullScreenVAO(
vtkOpenGLRenderWindow* renWin, vtkOpenGLVertexArrayObject* vao, vtkShaderProgram* prog);
static void DrawFullScreenQuad();
//@}
// older signsature, we suggest you use the newer signature above
static bool PrepFullScreenVAO(
vtkOpenGLBufferObject* verts, vtkOpenGLVertexArrayObject* vao, vtkShaderProgram* prog);
/**
* Pass a debugging mark to the render engine to assist development via tools
* like apitrace. This calls glDebugMessageInsert to insert the event string
* into the OpenGL command stream.
*
* Note that this method only works when glDebugMessageInsert is bound, which
* it may not be on certain platforms.
*/
static void MarkDebugEvent(const std::string& event);
protected:
vtkOpenGLRenderUtilities();
~vtkOpenGLRenderUtilities() override;
private:
vtkOpenGLRenderUtilities(const vtkOpenGLRenderUtilities&) = delete;
void operator=(const vtkOpenGLRenderUtilities&) = delete;
};
#endif