我想将场景渲染到最初为空的纹理.为此,我使用一个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) 我使用顶点缓冲区对象渲染某些几何体时遇到问题.我打算绘制一个点平面,所以基本上是我空间中每个离散位置的一个顶点.但是,我无法渲染该平面,因为每次调用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) 我一直想知道是否有可能在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次之后就不会这么做了.
所以,我一直在想是否有另一种方法可以获得相同的结果.我提出了两个想法:
所以,我的问题是:
如果你能给我建议,我将不胜感激.就OpenGL而言,我真的是一个新手.
谢谢沃尔特
使用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)