- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 GL_TRIANGLE_STRIP 模式渲染和纹理立方体。
多维数据集的基本信息在以下数组中。它被正确加载,形状还可以。
float vertexData[24] = { //Coordinates for the vertices of a cube.
//vertices
1, 1, -1,
-1, 1, -1,
1, -1, -1,
-1, -1, -1,
1, 1, 1,
-1, 1, 1,
-1, -1, 1,
1, -1, 1
};
int vertexDrawIndices[14] = { //Draw order for vertices in GL_TRIANGLE_STRIP mode.
3,2,6,7,4,2,0,3,1,6,5,4,1,0
};
最佳答案
多么美妙的谜题…… – 重新开始工作前的正确热身。
我看到两种可能的解决方案:
const GLfloat x0 = -1, x1 = 1, y0 = -1, y1 = 1, z0 = -1, z1 = 1;
const GLfloat coords[] = {
x0, y1, z1,
x0, y0, z0,
x0, y0, z1,
x1, y0, z1,
x0, y1, z1,
x1, y1, z1,
x1, y1, z0,
x1, y0, z1,
x1, y0, z0,
x0, y0, z0,
x1, y1, z0,
x0, y1, z0,
x0, y1, z1,
x0, y0, z0
};
const GLfloat s0 = 0, s1 = 1.f / 5, s2 = 2.f / 5, s3 = 3.f / 5, s4 = 4.f / 5, s5 = 1;
const GLfloat t0 = 0, t1 = 1.f / 5, t2 = 2.f / 5, t3 = 3.f / 5, t4 = 4.f / 5, t5 = 1;
const GLfloat texCoords[] = {
s0, t1,
s1, t0,
s1, t1,
s2, t1,
s1, t2,
s2, t2,
s2, t3,
s3, t2,
s3, t3,
s4, t3,
s3, t4,
s4, t4,
s4, t5,
s5, t4
};
QOpenGLWidget
我在我的个人文件夹中找到的样本,使用上面的图像作为纹理。
testQOpenGLTexCube.cc
:
#include <QtWidgets>
#include <QOpenGLFunctions_3_3_Compatibility>
class GLWidget: public QOpenGLWidget,
protected QOpenGLFunctions_3_3_Compatibility
{
private:
QOpenGLTexture *_pGLTex;
QOpenGLShaderProgram *_pGLPrg;
GLuint _coordAttr;
GLuint _texCoordAttr;
GLuint _matUniform;
double _t;
QMatrix4x4 _matProj;
QTimer _qTimerAnim;
public:
GLWidget(QWidget *pQParent = nullptr):
QOpenGLWidget(pQParent),
_pGLTex(nullptr), _pGLPrg(nullptr), _t(0)
{
QObject::connect(&_qTimerAnim, &QTimer::timeout,
[this]() { _t += 0.1; update(); });
}
virtual ~GLWidget() = default;
GLWidget(const GLWidget&) = delete;
GLWidget& operator=(const GLWidget&) = delete;
public:
virtual QSize minimumSizeHint() const
{
return QSize(50, 50);
}
virtual QSize sizeHint() const
{
return QSize(400, 400);
}
protected:
virtual void initializeGL();
virtual void resizeGL(int width, int height);
virtual void paintGL();
};
static const char *vertexShaderSource =
"# version 330\n"
"layout (location = 0) in vec3 coord;\n"
"layout (location = 1) in vec2 texCoord;\n"
"uniform mat4 mat;\n"
"out vec2 texCoordVtx;\n"
"void main() {\n"
" texCoordVtx = texCoord;\n"
" gl_Position = mat * vec4(coord, 1.0);\n"
"}\n";
static const char *fragmentShaderSource =
"#version 330\n"
"in vec2 texCoordVtx;\n"
"uniform sampler2D tex;\n"
"out vec4 colorFrag;\n"
"void main() {\n"
" colorFrag = texture2D(tex, texCoordVtx.xy);\n"
"}\n";
void GLWidget::initializeGL()
{
initializeOpenGLFunctions();
glClearColor(0.525f, 0.733f, 0.851f, 1.0f);
_qTimerAnim.start();
}
void GLWidget::resizeGL(int w, int h)
{
_matProj.setToIdentity();
_matProj.perspective(45.0f, GLfloat(w) / h, 0.01f, 100.0f);
}
void GLWidget::paintGL()
{
const qreal retinaScale = devicePixelRatio();
glViewport(0, 0, width() * retinaScale, height() * retinaScale);
// clear screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// create texture if not yet done
if (!_pGLTex) {
_pGLTex = new QOpenGLTexture(QImage("cube-tex.png").mirrored());
_pGLTex->setMagnificationFilter(QOpenGLTexture::Nearest);
_pGLTex->setMinificationFilter(QOpenGLTexture::Nearest);
}
// create shader program if not yet done
if (!_pGLPrg) {
_pGLPrg = new QOpenGLShaderProgram(this);
_pGLPrg->addShaderFromSourceCode(QOpenGLShader::Vertex,
vertexShaderSource);
_pGLPrg->addShaderFromSourceCode(QOpenGLShader::Fragment,
fragmentShaderSource);
_pGLPrg->link();
_coordAttr = _pGLPrg->attributeLocation("coord");
_texCoordAttr = _pGLPrg->attributeLocation("texCoord");
_matUniform = _pGLPrg->uniformLocation("mat");
_pGLPrg->setUniformValue("tex", 0);
}
// render textured cube
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
_pGLPrg->bind();
_pGLTex->bind();
QMatrix4x4 mat = _matProj;
mat.translate(0, 0, -5);
mat.rotate(_t, -1.0, -1.0, 1.0);
_pGLPrg->setUniformValue(_matUniform, mat);
const GLfloat x0 = -1, x1 = 1, y0 = -1, y1 = 1, z0 = -1, z1 = 1;
const GLfloat coords[] = {
x0, y1, z1,
x0, y0, z0,
x0, y0, z1,
x1, y0, z1,
x0, y1, z1,
x1, y1, z1,
x1, y1, z0,
x1, y0, z1,
x1, y0, z0,
x0, y0, z0,
x1, y1, z0,
x0, y1, z0,
x0, y1, z1,
x0, y0, z0
};
const GLfloat s0 = 0, s1 = 1.f / 5, s2 = 2.f / 5, s3 = 3.f / 5, s4 = 4.f / 5, s5 = 1;
const GLfloat t0 = 0, t1 = 1.f / 5, t2 = 2.f / 5, t3 = 3.f / 5, t4 = 4.f / 5, t5 = 1;
const GLfloat texCoords[] = {
s0, t1,
s1, t0,
s1, t1,
s2, t1,
s1, t2,
s2, t2,
s2, t3,
s3, t2,
s3, t3,
s4, t3,
s3, t4,
s4, t4,
s4, t5,
s5, t4
};
glVertexAttribPointer(_coordAttr, 3, GL_FLOAT, GL_FALSE, 0, coords);
glVertexAttribPointer(_texCoordAttr, 2, GL_FLOAT, GL_FALSE, 0, texCoords);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 14);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);
// done
_pGLTex->release(); _pGLPrg->release();
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// setup GUI
QMainWindow qMainWin;
GLWidget glWidget;
qMainWin.setCentralWidget(&glWidget);
qMainWin.show();
// runtime loop
return app.exec();
}
关于c++ - 我可以纹理这个在 GL_TRIANGLE_STRIP 模式下渲染的立方体吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60537484/
如果我有 4 个按此顺序渲染的顶点: 2-3 |\| 0-1 使用 GL_TRIANGLE_STRIP然后我启用背面剔除,正面定义为逆时针,那么左下角的三角形会面向我而另一个不是吗?如果是这样,渲染正
我是 open gl 的 biggener。首先,我只是尝试使用 GL_TRIANGLE_STRIP 绘制一个具有三个顶点的简单三角形。为什么 open gl 在末尾的原点添加额外的点?这是代码片段:
我需要一个只能由 GL_TRIANGLE_STRIP 完成的多边形示例和另一个只能由 GL_TRIANGLE_FAN 完成的多边形示例。 最佳答案 当知道三角条和三角扇之间的区别时,形状就会很容易制作
是否可以仅使用一个 GL_TRIANGLE_STRIP 绘制整个立方体? 显然,我在这里关心的只是立方体组合,它也可能被拉伸(stretch)成任何类型的盒子或类似的对象。 最佳答案 摘自论文Opti
我正在尝试使用 LWJGL 从包含所有字符的纹理图集中在 OpenGL 中绘制一个字符串。 现在我为每个字符添加三个顶点到网格,这将被渲染 GL11.glDrawArrays(GL11.GL_TRIA
我正在尝试使用 GL_TRIANGLE_STRIP 模式渲染和纹理立方体。 多维数据集的基本信息在以下数组中。它被正确加载,形状还可以。 float vertexData[24] = { //
我有这个方法来准备 posCoords 数组中的坐标。大约 30% 的时间它工作正常,然后其他 70% 的前几个三角形在网格中被弄乱了。整个网格使用 GL_TRIANGLE_STRIP 绘制。我正在拔
我正在尝试编写一种方法,使用 GL_TRIANGLE_STRIP 绘制从起始角到结束角的弧。我编写了以下代码,但存在以下问题: 我似乎无法找到合适的角度。它们似乎偏离了应有的位置(不是 90/45/1
我有一些 GL_TRIANGLE_STRIP 基元,它们的绘制方式如下: glNewList(heightmapDisplayList, GL_COMPILE); for (int z = 0; z
我正在努力让 opengl 三角形带显示为线框。我的显示算法看起来像这样: // want to display by strip here to allow for quick processing
关于索引三角形或三角形 strip 之间的渲染性能已经引起了相当大的讨论。但我相信有一个案例没有得到足够的考虑。 索引三角形在 OpenGl 中是这样渲染的: glDrawElements(GL_TR
我有来自 *.obj 文件的数据。 我知道如何使用 GL_TRIANGLES 绘图。我如何为 GL_TRIANGLE_STRIP 转换数据? 像 glDrawArrays(GL_TRIANGLE_ST
我正在使用 GL_TRIANGLE_STRIPS 和 LWJGL OpenGL Java 绑定(bind)实现高度图。当我使用“GL_BEGIN/GL_END”绘制“直接”时,它工作得很好,但是当高度
出于学习目的,我决定使用 3 种方法绘制球体 显示列表 Voa Vbo (GL_TRIANGLE_STRIPE) Vao Vbo 和 Ibo (GL_TRIANGLES) 我听说使用 ibo 可以使程
我正在尝试使用对 glDrawElements() 的单个调用来呈现一组线条。每条线都是一个四边形,我在它们之间使用退化三角形来分隔它们。 渲染时,使用索引 0、n-1 和 n-2 处的顶点绘制了一个
这可能吗?如果我有 2 个四边形的 8 个顶点,位置不同(基于四边形),是否可以通过一次调用 glDrawElement 来绘制这个四边形中的两个? 最佳答案 您可以使用退化三角形(面积为 0 的三角
我正在使用 C++ 开发一个基于 sprite 的简单 2D 游戏,该游戏使用 OpenGL 进行硬件加速渲染,并使用 SDL 进行窗口管理和用户输入处理。由于它是一款 2D 游戏,我只需要绘制四边形
尝试绘制一条三角形,如下所示: 完成了 objc.io tutorial ,他们使用两个三角形绘制四边形。三角形断开连接并单独绘制,这意味着我需要指定 6 个顶点而不是 4 个。 // Interle
在this document (Apple 关于 OpenGL 的 iOS 文档),Apple 建议在 iOS 上的 OpenGL ES 中对(索引)三角形使用三角形带: For best perfo
我目前正在渲染一条很长的路径: glDrawArrays(GL_TRIANGLE_STRIP, 0, 2000); 我将控制点传递给这样的 vbo: for (unsigned int i = 0;
我是一名优秀的程序员,十分优秀!