我有一条由2D点列表组成的路径.我想将它们变成一条三角形,以渲染具有指定厚度的纹理线条(和其他类似的东西).因此,2D点的列表基本上需要成为顶点列表,指定多边形的轮廓,如果渲染将呈现该线.问题在于处理拐角连接,斜角,盖帽等.在没有过度拉伸,清洁连接等意义上,所产生的多边形需要是"完美的",以便它可以被挤压或以其他方式玩弄.
是否有任何简单的资源可以提供算法洞察,代码或有效执行此操作的更多信息?
我绝对不想要一个完整的2D矢量库(cairo,antigrain,OpenVG等),包括曲线,弧形,破折号以及所有的铃声和口哨声.我一直在挖掘OpenVG实现和其他东西的多个源代码树以找到一些见解,但它们都非常复杂.
我绝对愿意自己编写代码,但有很多退化情况(小段+粗宽+尖角)会产生各种连接问题.即使是一点点帮助也可以节省我数小时的时间来处理它们.
编辑:这是一个例子,如果你只是从顶点到顶点,那些导致丑陋的退化情况.红色是原始路径.橙色块是以指定宽度绘制的矩形,对齐并以每个段为中心.
我发现OpenGL中的SwapBuffers会忙着等待,只要显卡没有完成渲染,或者它正在等待V-Sync.
这对我来说是个问题,因为我不想在等待卡完成时浪费100%的CPU核心.我不是在编写游戏,所以我不能将CPU周期用于任何更高效的工作,我只想将它们放到操作系统中的其他进程中.
我发现回调函数如glutTimerFunc和glutIdleFunc可能对我有用,但我不想使用过剩.仍然,过剩必须以某种方式使用正常的gl函数来做到这一点,对吗?
有没有像"glReadyToSwap"或类似的功能?在那种情况下,我可以检查每毫秒左右,并确定我是否应该等待一段时间或进行交换.我也可以想象也许跳过SwapBuffers并编写我自己类似的功能,如果有人能指出我正确的方向,那就不要忙.
我最近写一些的OpenGL 3.3代码与顶点数组对象(VAO)并测试它以后英特尔图形适配器,我发现,我感到失望,该元件阵列缓冲器结合显然不是VAO状态的一部分,作为呼叫:
glBindVertexArray(my_vao);
glDrawElements(GL_TRIANGLE_STRIP, count, GL_UNSIGNED_INTEGER, 0);
Run Code Online (Sandbox Code Playgroud)
没有效果,而:
glBindVertexArray(my_vao);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, my_index_buffer); // ?
glDrawElements(GL_TRIANGLE_STRIP, count, GL_UNSIGNED_INTEGER, 0);
Run Code Online (Sandbox Code Playgroud)
渲染几何体.我认为这是在英特尔执行的OpenGL(因为它是在GL_ARB_vertex_array_object即使在GL_OES_vertex_array_object明确提出(和)该元素阵列的一个单纯的错误是保存状态的一部分),但随后在移动的NVIDIA Quadro 4200发生这不好玩.
它是我的代码中的驱动程序错误,规格错误或错误吗?代码在GeForce 260和480上完美运行.
有没有类似的经历?
什么也奇怪的是,GL_EXT_direct_state_access不具有结合元件阵列缓冲器到VAO的函数(但是它确实有功能来指定顶点ATTRIB阵列,因此阵列缓冲器).GPU制造商是否违反规范并欺骗我们,或者是什么?
编辑:
我原本不打算显示任何源代码,因为我认为这里没有必要.但是根据要求,这是重现问题的最小测试用例:
static GLuint n_vertex_buffer_object, p_index_buffer_object_list[3];
static GLuint p_vao[2];
bool InitGLObjects()
{
const float p_quad_verts_colors[] = {
1, 0, 0, -1, 1, 0,
1, 0, 0, 1, 1, 0,
1, 0, 0, 1, -1, 0,
1, 0, 0, -1, -1, 0, // red quad
0, 0, 1, -1, 1, 0,
0, 0, 1, …Run Code Online (Sandbox Code Playgroud) 我试图用最新版本的qt创建器设置SFML 2.0,我已经设置了SFML,我导入了一个我在visual studio中编写的小游戏.编译后,我得到这个:

我尝试了什么
额外细节
我正在运行Windows XP SP3,最新版本的mingw和qt SDK以及SFML
我正在尝试使用的代码在Visual Studio 2010 和 Code :: Blocks 上没有任何错误甚至警告
我自己没有编译SFML
我的gcc版本是4.6.2
我的gcc是DW2
我没有得到任何结果,我甚至不知道如何远程接近解决这个问题,甚至不知道从哪里开始.
编辑 我无法向您展示我的所有代码,它是超过20个文件,我几乎90%确定它不是我的代码,我上面说过:我可以运行此代码,没有任何警告甚至任何IDE上的错误除了qt创建者.
我目前使用名为procamcalib的JavaCV软件来校准Kinect-Projector设置,该设置以Kinect RGB Camera为原点.此设置仅包括Kinect RGB相机(我现在大致使用Kinect作为普通相机)和一台投影仪.该校准软件使用LibFreenect(OpenKinect)作为Kinect驱动程序.
一旦软件完成其过程,它将为我提供相机和投影仪的内在和外在参数,这些参数被抛出在OpenGL软件上以验证校准,并且是一些问题开始的地方.正确设置投影和模型视图后,我应该能够适应Kinect所看到的投影内容,但为了达到这个目的,我必须在所有3轴上进行手动平移,最后一部分不做对我有任何意义!你能帮我解整一下吗?用于检索Kinect数据的SDK是OpenNI(不是最新的2.x版本,应该是1.5.x)
我将解释我正在做什么来重现这个错误.校准参数使用如下:
投影矩阵设置为(基于 http://sightations.wordpress.com/2010/08/03/simulating-calibrated-cameras-in-opengl/):
r = width/2.0f; l = -width/2.0f;
t = height/2.0f; b = -height/2.0f;
alpha = fx; beta = fy;
xo = cx; yo = cy;
X = kinectCalibration.c_near + kinectCalibration.c_far;
Y = kinectCalibration.c_near*kinectCalibration.c_far;
d = kinectCalibration.c_near - kinectCalibration.c_far;
float* glOrthoMatrix = (float*)malloc(16*sizeof(float));
glOrthoMatrix[0] = 2/(r-l); glOrthoMatrix[4] = 0.0f; glOrthoMatrix[8] = 0.0f; glOrthoMatrix[12] = (r+l)/(l-r);
glOrthoMatrix[1] = 0.0f; glOrthoMatrix[5] = 2/(t-b); glOrthoMatrix[9] = …Run Code Online (Sandbox Code Playgroud) 我需要使用CentOS在AWS EC2 GPU实例上执行一些离屏渲染程序.然而,虽然我发现Ubuntu很容易设置,但我不能让CentOS正常工作.
目标是在EC2 GPU实例上运行一些基本的实用程序/测试工具(没有屏幕或X客户端).在下面的文章中,我将描述如何设置Ubuntu以及CentOS/Amazon Linux AMI如何失败.
在ubuntu 12.04上,一切都很顺利.我使用的EC2环境是:
启动实例后,将执行以下命令:
# Install the Nvidia driver
sudo apt-add-repository ppa:ubuntu-x-swat/x-updates
sudo apt-get update
sudo apt-get install nvidia-current
# Driver installation needs reboot
sudo reboot now
# Install and configure X window with virtual screen
sudo apt-get install xserver-xorg libglu1-mesa-dev freeglut3-dev mesa-common-dev libxmu-dev libxi-dev
sudo nvidia-xconfig -a --use-display-device=None --virtual=1280x1024
sudo /usr/bin/X :0 &
# OpenGL programs are now workable. Ex. glxinfo, glxgears
DISPLAY=:0 glxinfo
Run Code Online (Sandbox Code Playgroud)
该glxgears …
我刚刚将MacBook Pro升级为Mavericks(MacOS 10.9),包括Xcode.根据Apple的"OpenGL功能表",这个版本支持OpenGL 4.1,但是对glGetString(GL_VERSION)的调用返回"1.2",我的GLSL 3.30着色器以"#version 330"开头拒绝加载,说版本不受支持.
我需要为Mavericks做些什么来启用4.1支持吗?
我需要压制"-arch x86_64 -arch i386"标志Waf传递给GCC.
我正在构建一个SDL/Opengl应用程序.如果我链接32位SDL运行时我得到错误
Undefined symbols for architecture i386:
"_SDL_Quit", referenced from:
__del_video in SDL_functions.c.2.o
__init_video in SDL_functions.c.2.o
Run Code Online (Sandbox Code Playgroud)
如果我链接到64位SDL运行时,我会收到错误"架构x86_64的未定义符号"
编译器显然使用标志
-arch x86_64 -arch i386
Run Code Online (Sandbox Code Playgroud)
据我所知,这会导致OSX上的GCC尝试编译这两种架构.我想编译为64位,或编译为32位.如何抑制一个架构的标志?
我有两个类型SCNVector3的点(我们称之为pointA和pointB).我想在它们之间画一条线.看起来应该很容易,但找不到办法.
我看到两个选项,都有问题:
使用半径非常小的SCNCylinder,长度为| pointA-pointB | 然后定位/旋转它.
使用自定义SCNGeometry但不确定如何; 或许必须定义两个三角形才能形成一个非常薄的矩形?
似乎应该有一种更简单的方法来做到这一点,但我似乎无法找到一个.
编辑:使用三角形方法给我这个在(0,0,0)和(10,10,10)之间画一条线:
CGFloat delta = 0.1;
SCNVector3 positions[] = { SCNVector3Make(0,0,0),
SCNVector3Make(10, 10, 10),
SCNVector3Make(0+delta, 0+delta, 0+delta),
SCNVector3Make(10+delta, 10+delta, 10+delta)};
int indicies[] = {
0,2,1,
1,2,3
};
SCNGeometrySource *vertexSource = [SCNGeometrySource geometrySourceWithVertices:positions count:4];
NSData *indexData = [NSData dataWithBytes:indicies length:sizeof(indicies)];
SCNGeometryElement *element = [SCNGeometryElement geometryElementWithData:indexData primitiveType:SCNGeometryPrimitiveTypeTriangles primitiveCount:2 bytesPerIndex:sizeof(int)];
SCNGeometry *line = [SCNGeometry geometryWithSources:@[vertexSource] elements:@[element]];
SCNNode *lineNode = [SCNNode nodeWithGeometry:line];
[root addChildNode:lineNode];
Run Code Online (Sandbox Code Playgroud)
但是有一些问题:由于法线,你只能从一边看到这条线!它从另一边看不见.此外,如果"delta"太小,则根本看不到该线.实际上,它在技术上是一个矩形,而不是我想要的线,如果我想绘制多个连接线,可能会导致小的图形故障.
我正在使用stb_image加载一个32位的PNG文件(RGBA),我用它创建一个OpenGL纹理.
它适用于24位PNG文件(没有alpha通道),但是当我使用32位PNG文件时,出现问题.
这就是纹理应该是这样的:

这就是使用OpenGL渲染时的样子(黑色部分是透明的,当我启用混合时):

这是我加载纹理的方式:
int w;
int h;
int comp;
unsigned char* image = stbi_load(filename.c_str(), &w, &h, &comp, STBI_rgb);
if(image == nullptr)
throw(std::string("Failed to load texture"));
glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
if(comp == 3)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
else if(comp == 4)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
glBindTexture(GL_TEXTURE_2D, 0);
stbi_image_free(image);
Run Code Online (Sandbox Code Playgroud)
这些是窗口参数(使用SDL)
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); …Run Code Online (Sandbox Code Playgroud) opengl ×10
c++ ×4
macos ×3
alpha ×1
amazon-ec2 ×1
camera ×1
centos ×1
cocoa ×1
geometry ×1
glew ×1
glsl ×1
gpu ×1
intel ×1
kinect ×1
line ×1
mapping ×1
miter ×1
nvidia ×1
objective-c ×1
opengl-3 ×1
path ×1
png ×1
qt-creator ×1
scenekit ×1
sdl ×1
sfml ×1
textures ×1
vertex-array ×1
waf ×1
winapi ×1