小编Wal*_*ter的帖子

OpenGL:渲染到纹理和帧缓冲对象的麻烦

我想将场景渲染到最初为空的纹理.为此,我使用一个Framebuffer对象,我附加一个空的2d纹理和一个深度缓冲区.设置完成后,为了测试,我在场景中绘制了一个简单的四边形.每个顶点都有不同的颜色,所以我最终期望纹理中有一个颜色插值的四边形.然后我使用包含四边形的纹理并将其映射到另一个四边形.所以,我在默认的Framebuffer中有一个四边形,它有一个包含彩色四边形的纹理.我希望这不会太混乱......

无论如何,我必须在这里遗漏一些东西,因为我得到的只不过是灰色的纹理.我基本上遵循了这些非常简单的指示.但是,我无法弄清楚我在这里缺少什么.如果有人能给我一些线索,我将不胜感激.

谢谢沃尔特


这是我到目前为止的代码://创建帧缓冲对象glGenFramebuffers(1,&frameBufferObject);

// create depth buffer
glGenRenderbuffers(1, &depthAttachment);

// create empty texture
int width = 512;
int height = 512;
int numberOfChannels = 3;
GLuint internalFormat = GL_RGB;
GLuint format = GL_RGB;

unsigned char* texels = new unsigned char[width * height * numberOfChannels];

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, GL_UNSIGNED_BYTE, texels);

glGenerateMipmap(GL_TEXTURE_2D);

delete[] texels;
texels = NULL;

// activate …
Run Code Online (Sandbox Code Playgroud)

opengl rendering render framebuffer texture-mapping

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

OpenGL 3.x:使用顶点缓冲区对象和glDrawElements(...)时的访问冲突

我使用顶点缓冲区对象渲染某些几何体时遇到问题.我打算绘制一个点平面,所以基本上是我空间中每个离散位置的一个顶点.但是,我无法渲染该平面,因为每次调用glDrawElements(...)时,应用程序崩溃都会返回访问冲突异常.我想,在初始化时肯定会有一些错误.

这是我到目前为止:


#define SPACE_X 512
#define SPACE_Z 512

typedef struct{
    GLfloat x, y, z; // position
    GLfloat nx, ny, nz; // normals
    GLfloat r, g, b, a; // colors
} Vertex;

typedef struct{
    GLuint i; // index
} Index;

// create vertex buffer
GLuint vertexBufferObject;
glGenBuffers(1, &vertexBufferObject);

// create index buffer
GLuint indexBufferObject;
glGenBuffers(1, &indexBufferObject);

// determine number of vertices / primitives
const int numberOfVertices = SPACE_X * SPACE_Z;
const int numberOfPrimitives = numberOfVertices; // As I'm going to render …
Run Code Online (Sandbox Code Playgroud)

opengl vertex-buffer opengl-3

5
推荐指数
1
解决办法
4924
查看次数

OpenGL 3.3,GLSL 1.5:如何设置包含各种texture2D的纹理缓冲区对象?

我一直想知道是否有可能在GLSL 1.5顶点着色器中有一个sampler2D数组.

我需要从顶点着色器访问30种不同的2d纹理.我读到不可能有这样的结构:

uniform sampler2d texture[30];
Run Code Online (Sandbox Code Playgroud)

然而,有30种不同的制服有点夸张,相当难以管理......

所以,这让我想到了一个纹理缓冲对象.自OpenGL 3.0以来支持TBO.但是,我找不到一个好的教程或示例,分别展示了如何使用一个纹理而不是几个纹理来初始化TBO.

网站显示了如何使用单个纹理初始化TBO的示例.没什么大不了的.我认为最重要的方法是

void createTBO(GLuint* tbo, GLuint* tex)
Run Code Online (Sandbox Code Playgroud)

通过执行该方法

glTexBufferEXT(GL_TEXTURE_BUFFER_EXT, GL_RGBA32F_ARB, *tbo);  
Run Code Online (Sandbox Code Playgroud)

一个人实际上可以将纹理附加到缓冲区.这也在这里提到.我假设一个接一个地调用glTexBuffer 30次之后就不会这么做了.

所以,我一直在想是否有另一种方法可以获得相同的结果.我提出了两个想法:

  • 将30个2d纹理添加到3d纹理并将其直接附加到顶点着色器.然而,这将是对内存的大量浪费,因为大多数3d纹理的层都不会被使用.
  • 使用名为sampler2DArray的结构.它在规格中提到.但是,我搜索了网络,找不到有关如何实现该信息的任何有价值的信息.

所以,我的问题是:

  • 如何设置包含超过1个纹理的TBO?
  • 这有可能吗?
  • 您是否知道我可以找到有关在3d纹理中添加2d纹理的信息的来源?
  • 你知道哪些网站可以找到有关sampler2DArray的初始化,绑定和使用的信息吗?

如果你能给我建议,我将不胜感激.就OpenGL而言,我真的是一个新手.

谢谢沃尔特

opengl buffer textures glsl

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

为什么我的客户端在使用SSL套接字和Java 7时无法读取服务器发送的第二条消息?

使用Java 7和SSL套接字时,我遇到了一个令人费解的问题.

我有一个客户端/服务器包.两者都使用非常简单的协议相互发送XML数据.每条消息的前4个字节始终包含整个消息的长度.这意味着,它是XML数据的长度加上4个字节.

首先,客户端向服务器发送问候消息.接下来,服务器解释问候语并发送响应.然后,客户端自己解释该消息并发送其登录信息.服务器检查该信息并发回响应.但是这一次,客户端没有收到任何东西,尽管它使用与从服务器获取问候响应时相同的方法.

这是客户端的简化阅读方法:

private String readResponse() throws Exception
{
    BufferedInputStream inputBuffer = new BufferedInputStream(sslSocket.getInputStream());

    // Read and interprete the first 4 bytes to get the length of the XML-data
    int messageLength = readMessageLength(inputBuffer) - 4;

    // PROBLEM OCCURS HERE!

    // Read bufferSize bytes from stream
        byte[] byteArray = new byte[messageLength];
    inputBuffer.read(byteArray);

    // Return the XML-data
    return new String(byteArray);
}
Run Code Online (Sandbox Code Playgroud)

这里是从前4个字节中检索长度的方法......

private int readMessageLength(BufferedInputStream in) throws IOException {
    byte[] b = new byte[4];
    in.read(b, 0, 4);

    return (((b[0] & …
Run Code Online (Sandbox Code Playgroud)

java sockets ssl bufferedinputstream

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