标签: opengl

绘制具有不同纹理的多个对象

我是否正确理解在OpenGL中绘制每个具有不同纹理的多个对象的典型方法是一次只使用一个纹理绑定glBindTexture并绘制使用它的对象,然后绑定不同的纹理并执行相同的操作?

换句话说,在任何特定时间只有一个纹理可以"活动"以进行绘制,这是使用绑定的最后一个纹理glBindTexture.它是否正确?

opengl

0
推荐指数
1
解决办法
5193
查看次数

放大而不缩放图形

我(使用java slick2D库特别,但可能不会是这个问题的一个因素),学习OpenGL的2D.我发现我可以改变推动一个新的变换矩阵,例如将世界坐标转换为屏幕(视图)坐标.

我想使用它来缩放我的视图,增加对象之间的距离,但是一旦完成,我想在屏幕坐标中绘制图像和形状,如HUD.基本上,我希望坐标改变,但图形保持不变,所以我可以在每个比例上渲染自定义图像.

这可以通过一些聪明的转换或一些OpenGL选项来完成,而不是手动计算所有坐标吗?

opengl transformation scale

0
推荐指数
1
解决办法
857
查看次数

DrawToBitmap(DIB)中未显示OpenGL Win32纹理

我有一个实时OpenGL应用程序渲染一些纹理对象.我已经构建了一个函数来通过PFD_DRAW_TO_BITMAP将它渲染到DIB并将其复制到图像来制作渲染场景的内部屏幕截图.除了一种纹理外,它的效果非常好.这些是具有24bpp的JPG(因此每个R,G,B为8位).我可以加载它们并实时正确渲染,但不能渲染到DIB.对于其他纹理,效果很好.在虚拟机上测试我的应用程序时,我有相同的行为(WinXP,没有硬件加速!).这些特定的纹理甚至没有在实时渲染中显示.如果没有硬件加速,我猜WinXP使用自己的OpenGL软件实现,并回归到OpenGL 1.1.那么有没有3D硬件加速不能绘制的纹理?还是有一个常见的陷阱?

opengl winapi dib

0
推荐指数
1
解决办法
304
查看次数

MSAA解析为同一FBO的纹理附件

我一直在使用几个自定义FBO.FBO-A附有MSAA纹理,其中几何体被渲染.然后通过将FBO-A的MSAA纹理附件blit到FBO-B的常规tex 2d附件来解决.这个过程意味着在多个FBO之间进行切换,并在几个中说明相反,在不同的FBO之间切换附件之间的性能更明智.我试图设置MSAA纹理和附加到同一个FBO的常规纹理.但我发现我无法通过blitting做出决心.如果我从MSAA到常规纹理副本进行纹理复制,MSAA是否会像blitting一样被解决?

更新:

对于那些有兴趣知道在一个FBO中使用几个FBO和几个附件是否值得(性能明智)的人.我刚做了一个测试(NVidia Quadro 4000),结果是完全相同的FPS(+ = 15-20帧).但可能是硬件和OGL实现依赖.

opengl

0
推荐指数
1
解决办法
806
查看次数

纹理图集的正确实现

我目前正在与一块软件一起工作,该软件通过拍摄几张图像然后将它们拼接成游戏地图来生成游戏地图.现在我正在使用OpenGL来绘制这些地图.如您所知,在OpenGL中切换状态并进行多次绘制调用的成本很高.我决定实现一个纹理图集系统,它允许我在没有状态切换的单个绘图调用中绘制整个地图.但是,我在实现纹理图集方面遇到了问题.首先,将每个TILE存储在纹理图集或图像本身中会更好吗?其次,并非所有图像都保证是方形的,甚至是2的幂.我是否将它们填充到最接近的2,正方形或两者的功率?我担心的另一件事是图像可能变得非常大,我担心超出纹理的OpenGL大小限制,这会迫使我分割地图,破坏整个概念.

到目前为止,这是我的概念:

- 生成纹理

- 绑定纹理

- 生成足够大的图像来保存纹理(考虑填充?)

- 纹理?

-Upload subtexture为空白纹理,存储偏移量

- 取消纹理

c++ opengl texture2d

0
推荐指数
1
解决办法
2906
查看次数

排序子网/ VBO

我有一个我需要渲染的关卡.它分为数百个子网,其中包含哪些子网格可以查看哪个子网格的信息.每个级别都有一个纹理池,所有这些子网都可以引用.所有子网格都有按纹理排序的顶点.这是一个例子.

子网1

索引[1,3,4,5,6,2,7,8,10 ......]纹理1

索引[12,15,16,12,13,19]纹理2

当有1000个子网格和20个可能的纹理时,纹理交换量甚至可以考虑可见性.

我在VBO中按顺序包含了所有子网.我一直在试图找出优化渲染和消除所有不必要的纹理交换的最佳方法.如果我只是对VBO进行排序,我将失去子网格连接,并且可见性数据变得无用.或者有更好的方法吗?

或者我应该根据可见性每帧创建一个索引列表还是太慢?

编辑:这是我当前设置的细分.

具有所有顶点的VBO按顺序从子网格1纹理1,子网格1纹理2,一直到子网格n,纹理n运行.

我有一个IBO,它只是所有网格的所有索引,具有相同的相对顺序.

当我渲染时,我查阅子网格并有一个起始索引和计数,它们是IBO中该子网格和纹理的起始索引,然后是计数,即具有该纹理的数字.

这就是为什么我做了如此多的交换,这实际上是在放慢速度.

c++ opengl sorting vbo

0
推荐指数
1
解决办法
600
查看次数

如何在多维数据集中设置相机?

我有立方体,每个侧锁都有不同的颜色 -

public void display(GLAutoDrawable drawable) {

        final GL gl = drawable.getGL();
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);




        ///// SET CAMERA  /////  
        setCamera(gl, glu, 100);




        // /////// Cube - start ///////////

        // cube

        // ----- Render the Color Cube -----
        gl.glLoadIdentity(); // reset the current model-view matrix
        gl.glTranslatef(0f, 0.0f, -7.0f); // translate right and into the
                                                // screen
        gl.glRotatef(angleCube, 1.0f, 1.0f, 1.0f); // rotate about the x, y and
                                                    // z-axes

        gl.glBegin(GL.GL_QUADS); // of the color cube

        // Top-face
        gl.glColor3f(0.0f, 1.0f, 0.0f); // …
Run Code Online (Sandbox Code Playgroud)

java opengl jogl glulookat

0
推荐指数
1
解决办法
264
查看次数

OpenGl - 如何重复纹理?

这是我到目前为止:

 Rectangle::Rectangle(int x, int y)
  {
    sizeX_ = x * CASE;
    sizeY_ = y * CASE;
    texture_ = gdl::Image::load("./ressources/floor.jpg");
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  }

  void  Rectangle::draw()
{                                                                          
    texture_.bind();
    glBegin(GL_QUADS);

    glTexCoord2f(0.0f, 0.0f);
    glVertex3f(0.0f, 0.0f, 0.0f);

    glTexCoord2f(sizeX_ / CASE, 0.0f);
    glVertex3f(sizeX_, 0.0f, 0.0f);

    glTexCoord2f(0.0f, sizeY_ / CASE);
    glVertex3f(sizeX_, 0.0f, sizeY_);

    glTexCoord2f(sizeX_ / CASE, sizeY_ / CASE);
    glVertex3f(0.0f, 0.0f, sizeY_);

    glEnd();
  }
Run Code Online (Sandbox Code Playgroud)

构造函数在案例中采用地图的大小.例如:(10, 10).而真正的大小将在(10 * CASE)哪里CASE = 400.

但这并没有正确重复纹理.纹理似乎减少(好点)并从左上角点到右下角点.

难道我做错了什么 ?

c++ opengl

0
推荐指数
1
解决办法
1447
查看次数

将OpenGL依赖项与客户端代码和服务器代码分开

在我正在编写的游戏中,我希望有一个专用服务器连接到具有OpenGL渲染的客户端.除了服务器对mesa/OpenGL的不幸依赖之外,一切看起来都很棒.理想情况下,我希望能够拥有一个专用服务器而无需在十分之一上安装任何东西.

基本上,它归结为此.我的每个游戏对象都有一个精灵.为了渲染该精灵,必须通过图像数据将图像数据发送到图形卡glTexImage2D,并且a GLuint与纹理数据相关联.要渲染纹理,您需要纹理ID.

我通过使用两个不同的主文件将客户端与服务器分开,这两个主文件共享相同的核心游戏文件.只有客户端#include的图形相关文件.我的整体类结构如下所示:

//Core game stuff
class Image
{
    int width, height;
    //Image data
}

class Sprite
{
    const Image image;
}

//Graphics namespace
void renderObject()
{
    //Some rendering code...

    GLuint texId = loadTexture(someSprite.image);

    renderTexture(texId);

    unloadTexture(texId);
}
Run Code Online (Sandbox Code Playgroud)

现在,这看起来很棒,直到我们意识到每帧向图形卡发送图像数据很并且需要缓存.将GLuint图像存储在图像上是有意义的,甚至可以赋予它一个getTexture()功能.如果未设置,该函数将加载纹理并返回id.因此,图像数据将仅被发送到图形卡一次.

//Core game stuff
class Image
{
    int width, height;
    //Image data

    GLuint textureId;

  public:

    ~Image()
    {
        //...

        unloadTexture(textureId);
    }

    GLuint getTexture()
    {
        if(!textureId)
            return textureId = loadTexture();
        else
            return textureId; …
Run Code Online (Sandbox Code Playgroud)

c++ opengl dependencies

0
推荐指数
1
解决办法
230
查看次数

GLSL C风格数字演员

我遇到了以下问题.我有两个着色器(完全不相关),它们会转换为int并以不同的方式浮动.

从着色器#1(int到float)演示示例:

 color = vec4(float(fragment_count) / float(MAX_FRAGMENTS));
Run Code Online (Sandbox Code Playgroud)

从Shader#2(float到int)演示示例:

  int abNumFrag=(int)imageLoad(abufferCounterImg, coords).r;
Run Code Online (Sandbox Code Playgroud)

第一个着色器编译正常,但第二个着色器抛出错误:

"OpenGL不允许使用C-syle演员"

除非我启用扩展名:#extension GL_NV_gpu_shader5:enable

some(int)someFloat与cast int(someFloat)不一样吗?

opengl glsl

0
推荐指数
1
解决办法
3695
查看次数

标签 统计

opengl ×10

c++ ×4

dependencies ×1

dib ×1

glsl ×1

glulookat ×1

java ×1

jogl ×1

scale ×1

sorting ×1

texture2d ×1

transformation ×1

vbo ×1

winapi ×1