我有一些顶点数据.位置,法线,纹理坐标.我可能从.obj文件或其他格式加载它.也许我正在画一个立方体.但是每个顶点数据都有自己的索引.我可以使用OpenGL/Direct3D渲染这个网格数据吗?
我想知道着色器内部的"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部分?
从着色器中的深度缓冲区进行采样,返回0到1之间的值,如预期的那样.给定相机的近平面和远平面平面,如何计算此时的真实z值,即距相机的距离?
这个学期,我在我的大学学习了计算机图形学课程.目前,我们开始研究一些更先进的东西,如高度图,平均法线,细分等.
我来自面向对象的背景,所以我试图将我们所做的一切都放到可重用的类中.我在创建相机类方面取得了很大的成功,因为它主要取决于对gluLookAt()的一次调用,它几乎独立于OpenGL状态机的其余部分.
但是,我在其他方面遇到了一些麻烦.使用对象来表示原语并没有真正成功.这是因为实际的渲染调用依赖于很多外部事物,比如当前绑定的纹理等.如果您突然想要从特定类的表面法线更改为顶点法线,则会导致严重的问题.
我开始怀疑OO原则是否适用于OpenGL编码.至少,我认为我应该让我的课程不那么精细.
什么是堆栈溢出社区对此的看法?您的OpenGL编码最佳实践是什么?
我有一个关于如何设置纹理的问题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)
这是否意味着,如果我使用的数量i在glUniform1i的话,我必须使用glActiveTexture(GL_TEXTURE **i** )?
我有一个校准过的相机(内在矩阵和失真系数),我想知道相机位置知道一些3d点及其在图像中的对应点(2d点).
我知道,cv::solvePnP能帮助我,看完这个和这个我明白solvePnP的,我的产出rvec和tvec是对象在相机的旋转和平移坐标系.
所以我需要找出世界坐标系中的摄像机旋转/平移.
从上面的链接看来,代码在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++),但这对我来说没有多大意义:
glTranslatef和glRotate调用?我的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) 我已经使用WPF的3D功能进行学习,并且在一些实现中,我发现它非常强大,而且我也在学习DirectX 11,与在WPF中使用3D类相比,它非常棘手.我只使用WPF 3D作为非常基本的东西,我的问题是:
WPF 3D是否同样适用于3D建模工具,游戏引擎和3D模拟等高级应用程序,以替代DirectX和OpenGL?
如果同一联赛中还有其他内容,请同时提及.
我正在学习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)
我正在关注一些初学者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)