VTK如何优雅的使用OpenGL

本文介绍了VTK库中的vtkShader类,详细解释了其主要接口功能,包括设置着色器类型、源代码、错误信息和编译过程,针对OpenGL中不同类型的着色器(如顶点、片段、几何)进行了说明。

写这篇文章的目的就是想学习OpenGL的实践方法,以便在后面的项目中扩展渲染引擎的功能。

VTK怎样管理着色器shader

上来就粘代码虽然看起来和没啥水平,但是作为理解别人写的程序的最好的方法,还是先看看他写了什么接口比较好总览全局。

class VTKRENDERINGOPENGL2_EXPORT vtkShader : public vtkObject
{
public:
  static vtkShader* New();
  vtkTypeMacro(vtkShader, vtkObject);
  void PrintSelf(ostream& os, vtkIndent indent) override;

  /** Available shader types. */
  enum Type
  {
    Vertex,   /**< Vertex shader */
    Fragment, /**< Fragment shader */
    Geometry, /**< Geometry shader */
    Unknown   /**< Unknown (default) */
  };

  /** Set the shader type. */
  void SetType(Type type);

  /** Get the shader type, typically Vertex or Fragment. */
  Type GetType() const { return this->ShaderType; }

  /** Set the shader source to the supplied string. */
  void SetSource(const std::string& source);

  /** Get the source for the shader. */
  std::string GetSource() const { return this->Source; }

  /** Get the error message (empty if none) for the shader. */
  std::string GetError() const { return this->Error; }

  /** Get the handle of the shader. */
  int GetHandle() const { return this->Handle; }

  /** Compile the shader.
   * @note A valid context must to current in order to compile the shader.
   */
  bool Compile();

  /** Delete the shader.
   * @note This should only be done once the ShaderProgram is done with the
   * Shader.
   */
  void Cleanup();

  class ReplacementSpec
  {
  public:
    std::string OriginalValue;
    vtkShader::Type ShaderType;
    bool ReplaceFirst;
    bool operator<(const ReplacementSpec& v1) const
    {
      if (this->OriginalValue != v1.OriginalValue)
      {
        return this->OriginalValue < v1.OriginalValue;
      }
      if (this->ShaderType != v1.ShaderType)
      {
        return this->ShaderType < v1.ShaderType;
      }
      return (this->ReplaceFirst < v1.ReplaceFirst);
    }
    bool operator>(const ReplacementSpec& v1) const
    {
      if (this->OriginalValue != v1.OriginalValue)
      {
        return this->OriginalValue > v1.OriginalValue;
      }
      if (this->ShaderType != v1.ShaderType)
      {
        return this->ShaderType > v1.ShaderType;
      }
      return (this->ReplaceFirst > v1.ReplaceFirst);
    }
  };
  class ReplacementValue
  {
  public:
    std::string Replacement;
    bool ReplaceAll;
  };

protected:
  vtkShader();
  ~vtkShader() override;

  Type ShaderType;
  int Handle;
  bool Dirty;

  std::string Source;
  std::string Error;

private:
  vtkShader(const vtkShader&) = delete;
  void operator=(const vtkShader&) = delete;
};

逐个分析这些接口的功能,在我看来大可不必。如果读者学过一些简单的OpenGL的接口,那上面的接口大概一看就知道什么用处了。

我在写这篇文章的时候,也只是略读了蓝宝书的几个基础的章节,所以我只能谈谈“现在”我对上面代码封装的接口的理解。(以下提到的着色器程序指的是OpenGL着色器代码或者着色器对象)

  1. 在OpenGL中着色器程序是分类型的,可编程的着色器程序主要有三类,顶点,几何和片段,所以需要定义Type枚举来标识类型;
  2. 在OpenGL中着色器程序是一段用C语言风格写的程序(它的功能主要告诉OpenGl怎样处理每个渲染阶段的数据和状态,更详细的作用后续再来补充),它在形式上属于一个字符串,所以需要用string类型来存储这个字符串;
  3. 在OpenGL中编译着色器程序时会返回一些信息,如错误信息,所以也需要一个Error string来出存储它;
  4. 在OpenGL中创建着色器程序时会返回一个int类型的值,标识这个着色器程序,所以也要有个Handle来寸它;
  5. 其他的东西就和OpenGL关系不大了,这些应该是为了优雅的封装OpenGL所需要的东西了
在Visual Studio 2019中使用OpenCV、VTKOpenGL,下面分别介绍相关配置方法: ### OpenCV配置 虽然未直接给出VS2019配置OpenCV的具体步骤,但从“VS2019+Opencv4.5.0+PCL1.11.1+OpenGL安装与环境配置”可知,配置完相关路径后需重启电脑生效,可推测配置过程与路径设置有关,配置路径示例如下: ```plaintext D:\programming\PCL 1.11.1\bin D:\programming\PCL 1.11.1\3rdParty\VTK\bin D:\programming\PCL 1.11.1\3rdParty\OpenNI2\Redist ``` 不过这些路径可能不只是OpenCV的,还包含了PCL及相关第三方库的路径,具体OpenCV路径需根据实际安装情况设置。 ### VTK配置 可参考“Visual Studio 2022 配置VTK9.3.0”的部分思路,在VS2019中,在“配置属性” - “C/C++” - "常规“ - “附加包含目录” 中把自己vtk文件路径下的类似 ..\build\include\vtk - 版本号 添加进去(假设版本号对应实际安装的VTK版本)。例如若安装的是VTK9.3.0,就添加 ..\build\include\vtk-9.3 ,因为头文件的路径包含在类似 ".../vtk - 版本号/" 里面 [^4]。 ### OpenGL配置 未直接提供VS2019配置OpenGL的信息,但OpenGL作为图形库,一般在VS中需要配置包含目录和库目录。包含目录通常是OpenGL相关头文件所在位置,库目录是库文件所在位置。一般Windows系统自带OpenGL基本库,可能只需在项目中包含相关头文件(如`#include <GL/glut.h>` )并链接相应库文件即可。 ### 开发教程 开发时,使用OpenCV可进行图像处理,如读取、显示和修改图像等操作;VTK可用于三维可视化和图形处理;OpenGL用于图形渲染。在代码编写上,以OpenCV为例,读取和显示图像的简单示例代码如下: ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { cv::Mat image = cv::imread("test.jpg"); if (image.empty()) { std::cout << "Could not open or find the image" << std::endl; return -1; } cv::imshow("Display window", image); cv::waitKey(0); return 0; } ``` VTKOpenGL的开发需要根据具体的需求和功能,调用相应的API进行开发。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值