nanogui GLShader C ++渲染布料,但看起来很薄-如何增加厚度?

时间:2019-03-22 03:58:30

标签: c++ opengl shader

我正在研究布料模拟器。它将布料建模为点之间具有弹簧质量约束的点的网格。例如,it has similar concepts as described in this tutorial

对于渲染,我使用的是使用nanogui GLShader对象的其他人的代码。它具有在线框中渲染布料的选项,以及通过两个选项提供的“平滑”选项(后者是我们感兴趣的'phong'着色器。这是clothSimulator.h和{{ 1}}:

clothSimulator.cpp

在cpp文件中:

#ifndef CGL_CLOTH_SIMULATOR_H
#define CGL_CLOTH_SIMULATOR_H

#include <nanogui/nanogui.h>
#include <zmq.hpp>

#include "camera.h"
#include "cloth.h"
#include "collision/collisionObject.h"

using namespace nanogui;

class ClothSimulator {

private:
  virtual void initGUI(Screen *screen);
  void drawWireframe(GLShader &shader);
  void drawNormals(GLShader &shader);
  void drawPhong(GLShader &shader);

  // OpenGL attributes
  enum e_shader { WIREFRAME = 0, NORMALS = 1, PHONG = 2 };
  e_shader activeShader = WIREFRAME;

  vector<GLShader> shaders;
  GLShader wireframeShader;
  GLShader normalShader;
  GLShader phongShader;

// a bunch of other stuff here ...

通常的想法是采用所有点,并使用着色器方法将它们渲染为三角形。 // a bunch of other stuff above ... void ClothSimulator::drawPhong(GLShader &shader) { int num_tris = cloth->clothMesh->triangles.size(); MatrixXf positions(3, num_tris * 3); MatrixXf normals(3, num_tris * 3); for (int i = 0; i < num_tris; i++) { Triangle *tri = cloth->clothMesh->triangles[i]; Vector3D p1 = tri->pm1->position; Vector3D p2 = tri->pm2->position; Vector3D p3 = tri->pm3->position; Vector3D n1 = tri->pm1->normal(); Vector3D n2 = tri->pm2->normal(); Vector3D n3 = tri->pm3->normal(); positions.col(i * 3) << p1.x, p1.y, p1.z; positions.col(i * 3 + 1) << p2.x, p2.y, p2.z; positions.col(i * 3 + 2) << p3.x, p3.y, p3.z; normals.col(i * 3) << n1.x, n1.y, n1.z; normals.col(i * 3 + 1) << n2.x, n2.y, n2.z; normals.col(i * 3 + 2) << n3.x, n3.y, n3.z; } Vector3D cp = camera.position(); shader.setUniform("in_color", color); shader.setUniform("eye", Vector3f(cp.x, cp.y, cp.z)); shader.setUniform("light", Vector3f(0.5, 2, 2)); shader.uploadAttrib("in_position", positions); shader.uploadAttrib("in_normal", normals); shader.drawArray(GL_TRIANGLES, 0, num_tris * 3); } // a bunch of other stuff below 方法似乎很重要。不幸的是,我不知道我能提供什么选择。 The documentation for the method appears to be limited,如果我使用的是正确的链接。

我现在拥有它的方式,布料呈现如下(示例):

enter image description here

但是,这使一块布非常“薄”。我希望增加渲染器中布料的厚度。是否应该调整传递给shader.drawArray的参数?还是调整我如何初始化着色器对象本身?我上面链接的教程实际上包含“ quil缝”布料的部分-这是最直接的(或唯一的)解决方案吗?

我希望这能传达我希望问的基本知识。请让我知道是否可以做些使其更容易理解的事情。

0 个答案:

没有答案