标签: opengl

使用多个索引渲染网格

我有一些顶点数据.位置,法线,纹理坐标.我可能从.obj文件或其他格式加载它.也许我正在画一个立方体.但是每个顶点数据都有自己的索引.我可以使用OpenGL/Direct3D渲染这个网格数据吗?

opengl direct3d opengl-es webgl vulkan

54
推荐指数
2
解决办法
1万
查看次数

If语句会减慢我的着色器吗?

我想知道着色器内部的"If-statements"(顶点/片段/像素......)是否真的会降低着色器性能.例如:

使用它更好吗:

vec3 output;
output = input*enable + input2*(1-enable);
Run Code Online (Sandbox Code Playgroud)

而不是使用这个:

vec3 output;
if(enable == 1)
{
    output = input;
}
else
{
    output = input2;
}
Run Code Online (Sandbox Code Playgroud)

在另一个论坛上有一个关于那个的讨论(2013):http://answers.unity3d.com/questions/442688/shader-if-else-performance.html 这里有人说,If语句真的很糟糕用于着色器的性能.

此外,他们还在讨论if/else语句(2012)中的内容:https: //www.opengl.org/discussion_boards/showthread.php/177762-Performance-alternative-for-if-(-)

也许硬件或着色器编译器现在更好,他们修复了这个(可能不存在)性能问题.

编辑:

在这种情况下,这里假设enable是一个统一变量,它总是设置为0:

if(enable == 1) //never happens
{
    output = vec4(0,0,0,0);
}
else  //always happens
{
    output = calcPhong(normal, lightDir);
}
Run Code Online (Sandbox Code Playgroud)

我想在这里我们在着色器中有一个分支,它会降低着色器的速度.那是对的吗?

制作2个不同的阴影是否更有意义,比如一个用于其他阴影,另一个用于if部分?

opengl shader direct3d glsl hlsl

53
推荐指数
2
解决办法
3万
查看次数

从深度缓冲区获取真实的z值

从着色器中的深度缓冲区进行采样,返回0到1之间的值,如预期的那样.给定相机的近平面和远平面平面,如何计算此时的真实z值,即距相机的距离?

opengl graphics shader

52
推荐指数
2
解决办法
4万
查看次数

OpenGL编码的一些最佳实践(尤其是面向对象)?

这个学期,我在我的大学学习了计算机图形学课程.目前,我们开始研究一些更先进的东西,如高度图,平均法线,细分等.

我来自面向对象的背景,所以我试图将我们所做的一切都放到可重用的类中.我在创建相机类方面取得了很大的成功,因为它主要取决于对gluLookAt()的一次调用,它几乎独立于OpenGL状态机的其余部分.

但是,我在其他方面遇到了一些麻烦.使用对象来表示原语并没有真正成功.这是因为实际的渲染调用依赖于很多外部事物,比如当前绑定的纹理等.如果您突然想要从特定类的表面法线更改为顶点法线,则会导致严重的问题.

我开始怀疑OO原则是否适用于OpenGL编码.至少,我认为我应该让我的课程不那么精细.

什么是堆栈溢出社区对此的看法?您的OpenGL编码最佳实践是什么?

c++ opengl oop

51
推荐指数
1
解决办法
2万
查看次数

通过glUniform1i设置纹理

我有一个关于如何设置纹理的问题glUniform1i.我见过如下代码.

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, texture0);
glUniform1i(_textureUniform, 0);
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, texture1);
glUniform1i(_textureUniform, 1);
Run Code Online (Sandbox Code Playgroud)

这是否意味着,如果我使用的数量iglUniform1i的话,我必须使用glActiveTexture(GL_TEXTURE **i** )

opengl

51
推荐指数
1
解决办法
2万
查看次数

来自cv :: solvePnP的世界坐标中的摄像机位置

我有一个校准过的相机(内在矩阵和失真系数),我想知道相机位置知道一些3d点及其在图像中的对应点(2d点).

我知道,cv::solvePnP能帮助我,看完这个这个我明白solvePnP的,我的产出rvectvec是对象在相机的旋转和平移坐标系.

所以我需要找出世界坐标系中的摄像机旋转/平移.

从上面的链接看来,代码在python中是直截了当的:

found,rvec,tvec = cv2.solvePnP(object_3d_points, object_2d_points, camera_matrix, dist_coefs)
rotM = cv2.Rodrigues(rvec)[0]
cameraPosition = -np.matrix(rotM).T * np.matrix(tvec)
Run Code Online (Sandbox Code Playgroud)

我不知道python/numpy东西(我正在使用C++),但这对我来说没有多大意义:

  • rvec,来自solvePnP的tvec输出是3x1矩阵,3个元素向量
  • cv2.Rodrigues(rvec)是一个3x3矩阵
  • cv2.Rodrigues(rvec)[0]是3x1矩阵,3个元素向量
  • cameraPosition是一个3x1*1x3矩阵乘法,是一个.. 3x3矩阵.我如何在opengl中使用这个简单glTranslatefglRotate调用?

c++ opengl opencv computer-vision pose-estimation

51
推荐指数
2
解决办法
4万
查看次数

glGenVertexArrays(1,&vao)的分段错误;

我的gdb回溯给出:

(gdb) backtrace
#0  0x00000000 in ?? ()
#1  0x0804a211 in init () at example1.cpp:147
#2  0x0804a6bc in main (argc=1, argv=0xbffff3d4) at example1.cpp:283
Run Code Online (Sandbox Code Playgroud)

信息量不大.Eclipse调试器至少让我看到它停在下面的第3行:

// Create a vertex array object
GLuint vao;
glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );
Run Code Online (Sandbox Code Playgroud)

这是一个非常常见的块,可以在gl编程中看到,我甚至可以使用相同的块运行其他代码,没有任何问题.所以我很困惑.

从运行make构建输出:

g++ -g -DFREEGLUT_STATIC -DGLEW_STATIC -I../../include example1.cpp ../../Commo/InitShader.o  -L/usr/lib/mesa -lGLEW -lglut -lGL -lX11  -lm  -o example1
Run Code Online (Sandbox Code Playgroud)

包含问题的程序:

// rotating cube with two texture objects
// change textures with 1 and 2 keys

#include "Angel.h"

const int  NumTriangles = 12; // …
Run Code Online (Sandbox Code Playgroud)

c++ opengl debugging segmentation-fault

50
推荐指数
1
解决办法
2万
查看次数

WPF 3D是复杂应用程序中DirectX和OpenGL的良好替代品吗?

我已经使用WPF的3D功能进行学习,并且在一些实现中,我发现它非常强大,而且我也在学习DirectX 11,与在WPF中使用3D类相比,它非常棘手.我只使用WPF 3D作为非常基本的东西,我的问题是:

WPF 3D是否同样适用于3D建模工具,游戏引擎和3D模拟等高级应用程序,以替代DirectX和OpenGL?

如果同一联赛中还有其他内容,请同时提及.

opengl directx 3d wpf graphics

50
推荐指数
3
解决办法
3万
查看次数

理解glm :: lookAt()

我正在学习OpenGL来学习OpenGL,在这个教程中他们使用glm::lookAt()函数来构建视图,但是我无法理解它的工作情况glm::lookAt(),显然,没有详细的GLM文档.谁能帮我理解参数和工作glm::lookAt()吗?

GLM文档说:

detail::tmat4x4<T> glm::gtc::matrix_transform::lookAt   
(   
    detail::tvec3< T > const &  eye,
    detail::tvec3< T > const &  center,
    detail::tvec3< T > const &  up 
)
Run Code Online (Sandbox Code Playgroud)

我目前的理解是相机位于eye并面向center.(我不知道是什么up)

c++ opengl glm-math

50
推荐指数
3
解决办法
8万
查看次数

glDrawArrays如何知道要绘制什么?

我正在关注一些初学者OpenGL教程,对这段代码感到有些困惑:

glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); //Bind GL_ARRAY_BUFFER to our handle
glEnableVertexAttribArray(0); //?
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); //Information about the array, 3 points for each vertex, using the float type, don't normalize, no stepping, and an offset of 0. I don't know what the first parameter does however, and how does this function know which array to deal with (does it always assume we're talking about GL_ARRAY_BUFFER?

glDrawArrays(GL_POINTS, 0, 1); //Draw the vertices, once again how does this know which vertices …
Run Code Online (Sandbox Code Playgroud)

opengl graphics rendering vertex

49
推荐指数
2
解决办法
4万
查看次数