标签: opengl

如何将粗2D线渲染为多边形?

我有一条由2D点列表组成的路径.我想将它们变成一条三角形,以渲染具有指定厚度的纹理线条(和其他类似的东西).因此,2D点的列表基本上需要成为顶点列表,指定多边形的轮廓,如果渲染将呈现该线.问题在于处理拐角连接,斜角,盖帽等.在没有过度拉伸,清洁连接等意义上,所产生的多边形需要是"完美的",以便它可以被挤压或以其他方式玩弄.

是否有任何简单的资源可以提供算法洞察,代码或有效执行此操作的更多信息?

我绝对不想要一个完整的2D矢量库(cairo,antigrain,OpenVG等),包括曲线,弧形,破折号以及所有的铃声和​​口哨声.我一直在挖掘OpenVG实现和其他东西的多个源代码树以找到一些见解,但它们都非常复杂.

我绝对愿意自己编写代码,但有很多退化情况(小段+粗宽+尖角)会产生各种连接问题.即使是一点点帮助也可以节省我数小时的时间来处理它们.

编辑:这是一个例子,如果你只是从顶点到顶点,那些导致丑陋的退化情况.红色是原始路径.橙色块是以指定宽度绘制的矩形,对齐并以每个段为中心.

http://www.freeimagehosting.net/uploads/52dc639727.png

opengl geometry path line miter

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

避免等待SwapBuffers

我发现OpenGL中的SwapBuffers会忙着等待,只要显卡没有完成渲染,或者它正在等待V-Sync.

这对我来说是个问题,因为我不想在等待卡完成时浪费100%的CPU核心.我不是在编写游戏,所以我不能将CPU周期用于任何更高效的工作,我只想将它们放到操作系统中的其他进程中.

我发现回调函数如glutTimerFunc和glutIdleFunc可能对我有用,但我不想使用过剩.仍然,过剩必须以某种方式使用正常的gl函数来做到这一点,对吗?

有没有像"glReadyToSwap"或类似的功能?在那种情况下,我可以检查每毫秒左右,并确定我是否应该等待一段时间或进行交换.我也可以想象也许跳过SwapBuffers并编写我自己类似的功能,如果有人能指出我正确的方向,那就不要忙.

c++ opengl winapi

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

VAO和元素数组缓冲区状态

我最近写一些的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)

opengl nvidia intel vertex-array opengl-3

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

无法初始化GLEW.缺少GL版本

我试图用最新版本的qt创建器设置SFML 2.0,我已经设置了SFML,我导入了一个我在visual studio中编写的小游戏.编译后,我得到这个:

在此输入图像描述

我尝试了什么

  • 从头开始重新安装整个qt SDK和qt creator IDE
  • 重新安装SFML
  • 重新安装mingw
  • 我试着编写一个简单的程序来确保它不是我的代码,程序编译正确但是当我关闭应用程序时,我得到的OpenGL错误不正常
  • 我尝试在SFML论坛上发帖,但无济于事.
  • 谷歌搜索错误显示一些特定于OpenGL的结果,并且过于本地化,它们不适用于我,在SFML 2.0中没有回答这个问题

额外细节

  • 我正在运行Windows XP SP3,最新版本的mingw和qt SDK以及SFML

  • 我正在尝试使用的代码在Visual Studio 2010 Code :: Blocks 上没有任何错误甚至警告

  • 是的,我确信在我的IDE上设置了SFML,基本代码可以正常运行,但是显示了这些错误,更高级的代码将所有精灵和文本显示为框.
  • 我自己没有编译SFML

  • 我的gcc版本是4.6.2

  • 我的gcc是DW2

我没有得到任何结果,我甚至不知道如何远程接近解决这个问题,甚至不知道从哪里开始.

编辑 我无法向您展示我的所有代码,它是超过20个文件,我几乎90%确定它不是我的代码,我上面说过:我可以运行此代码,没有任何警告甚至任何IDE上的错误除了qt创建者.

c++ opengl glew qt-creator sfml

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

使用Kinect和OpenGL进行投影映射

我目前使用名为procamcalibJavaCV软件来校准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)

c++ opengl mapping camera kinect

22
推荐指数
1
解决办法
2840
查看次数

使用CentOS在AWS GPU实例上运行OpenGL

我需要使用CentOS在AWS EC2 GPU实例上执行一些离屏渲染程序.然而,虽然我发现Ubuntu很容易设置,但我不能让CentOS正常工作.

目标是在EC2 GPU实例上运行一些基本的实用程序/测试工具(没有屏幕或X客户端).在下面的文章中,我将描述如何设置Ubuntu以及CentOS/Amazon Linux AMI如何失败.

Ubuntu的

在ubuntu 12.04上,一切都很顺利.我使用的EC2环境是:

  • 实例类型:CG1和G2都经过测试并正常工作.
  • AMI映像:用于HVM实例的Ubuntu Server 12.04.3 LTS(美国东部的ami-b93264d0)
  • 大多数其他设置都是默认设置.

启动实例后,将执行以下命令:

# 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 …

opengl gpu centos amazon-ec2 amazon-web-services

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

在Mavericks下的OpenGL 4.1(?)

我刚刚将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支持吗?

opengl macos glsl osx-mavericks

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

在OSX上使用Waf编译OpenGL/SDL应用程序时如何禁止'-arch','x86_64'标志?

我需要压制"-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位.如何抑制一个架构的标志?

opengl macos sdl waf

21
推荐指数
1
解决办法
1745
查看次数

使用SceneKit在两点之间画一条线

我有两个类型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"太小,则根本看不到该线.实际上,它在技术上是一个矩形,而不是我想要的线,如果我想绘制多个连接线,可能会导致小的图形故障.

opengl macos cocoa objective-c scenekit

21
推荐指数
5
解决办法
2万
查看次数

使用stb_image为OpenGL纹理加载PNG会产生错误的颜色

我正在使用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)

c++ opengl png textures alpha

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