我一直在使用openGL几个月,现在我自己学习它.现在我已经开始渲染位置,纹理坐标模型
我正在尝试使用动画模型,我将在显卡上进行动画蒙皮过程.
顺便说一句,如果有人想帮我1对1让我知道我不介意更直接的方法.
这是我的顶点格式
struct VERTEX_ANIMATED
{
float3 position;
float3 normal;
float2 texCoord;
float weights[4];
unsigned boneIndices[4];
};
Run Code Online (Sandbox Code Playgroud)
这就是我将我的顶点添加到gpu缓冲区句柄的方法(这些函数中的任何未初始化的变量都位于".h"中)
bool CVertexBuffer::IncreaseVerts( const unsigned int uiNumVerts )
{
//create our increase by value
unsigned uiIncrement = (uiNumVerts / BUFFER_INCREASE_SIZE) * BUFFER_INCREASE_SIZE + BUFFER_INCREASE_SIZE;
m_uiNumVerts += uiIncrement;
//bind to our buffer
void* buffer1;
if (GLEW_ARB_vertex_shader)
{
glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_uiVertBufferHandle );
//make sure our buffer exists
buffer1 = glMapBufferARB( GL_ARRAY_BUFFER_ARB, GL_READ_WRITE );
}
else
{
glBindBuffer( GL_ARRAY_BUFFER, m_uiVertBufferHandle );
//make sure our buffer …Run Code Online (Sandbox Code Playgroud) 这是我对渲染多个纹理的基本步骤的理解。
1) 绑定要渲染的着色器位置
m_uihDiffuseMap = glGetUniformLocation( m_iShaderProgramHandle, "diffuseMap" );
if( m_uihDiffuseMap != -1 )
glUniform1i( m_uihDiffuseMap, 0 );
m_uihNormalMap = glGetUniformLocation( m_iShaderProgramHandle, "normalMap" );
if( m_uihNormalMap != -1 )
glUniform1i( m_uihNormalMap, 1 );
Run Code Online (Sandbox Code Playgroud)
2)绑定到你想要渲染的内容
glBindFramebuffer( GL_FRAMEBUFFER, m_uifboHandle );
//diffuse texture binding
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_uiTextureHandle1, 0);
//normal texture binding
(or GL_COLOR_ATTACHMENT1)
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+1, m_uiTextureHandle2, 0);
Run Code Online (Sandbox Code Playgroud)
3)清除缓冲区并指定要绘制到的缓冲区
glClearColor( 1.0f, 1.0f, 1.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, buffers);
Run Code Online (Sandbox Code Playgroud)
4) 设置着色器程序进行渲染
glUseProgram( m_uiShaderProgramHandle ); …Run Code Online (Sandbox Code Playgroud) 我只处理过DirectX矩阵
我读过的文章说你不能将OpenX矩阵数学库用于openGL矩阵.
但我也读过,如果你的数学是一致的,你可以得到相似的结果.这让我更加困惑.
任何人都可以开导我吗?或者如果你不能在openGL矩阵上使用DirectX数学.有谁知道一个好的openGL矩阵库?
任何帮助,了解他们的差异和数学知识将不胜感激.
我已经初始化了 glewInit( ) 和任何其他 openGL 东西。所有这些都是在我拨打这些电话之前进行的。
glGenBuffers( 1, &m_uiVertBufferHandle );
glBindBuffer( GL_ARRAY_BUFFER, m_uiVertBufferHandle );
glBufferData( GL_ARRAY_BUFFER, 0, 0, GL_READ_WRITE );
glBindBuffer( GL_ARRAY_BUFFER, 0 );
Run Code Online (Sandbox Code Playgroud)
这就是我创建缓冲区对象的方式,ii 执行了 glBufferData,因为我在 openGL 文章中读到,如果您不至少调用一次它,则根本没有任何存储空间,这将使 glMapBuffer 总是给您 0x00000000。
稍后我调用 glMapBuffer 来获取我的存储位置以开始保存数据,当我使用 glMapBuffer 时我这样称呼它
void* buffer1;
glBindBuffer( GL_ARRAY_BUFFER, m_uiVertBufferHandle );
//make sure our buffer excists
buffer1 = glMapBuffer( GL_ARRAY_BUFFER, GL_READ_WRITE );
Run Code Online (Sandbox Code Playgroud)
我的 buffer1 中总是得到 0x00000000。为什么是这样?我发现的唯一两个原因是我没有正确初始化 glewInit (我已经完成了)并且我没有至少调用一次 glBindBufferData 。
我正在制作一个立方体贴图渲染目标类。我已经有一个2D的作品了。但是对于这个立方体贴图渲染目标类,我希望能够根据需要渲染到特定的面孔。也许我想在“ X +”面上渲染圆,但在“ Y +”面上渲染三角形。
这是我班的样子
class CRenderTarget
{
private:
//frame buffer to render on
unsigned m_uifboHandle;
//depth stencil
unsigned m_uiDepthStencilHandle;
//the texture we will render on
unsigned m_uiTextureHandle;
public:
CCubeRenderTarget( void );
~CCubeRenderTarget( void );
void Create( unsigned uiHeightWidth = 512,
int iInternalFormat = 0x1908 ); //GL_RGBA
void Bind( void );
void UnBind( void );
}
Run Code Online (Sandbox Code Playgroud)
这就是我的create函数的样子
void Create( unsigned uiHeightWidth, int iInternalFormat )
{
//generate our variables
glGenFramebuffers(1, &m_uifboHandle);
glGenRenderbuffers(1, &m_uiDepthStencilHandle);
glGenTextures(1, &m_uiTextureHandle);
// Initialize FBO
glBindFramebuffer( GL_FRAMEBUFFER, …Run Code Online (Sandbox Code Playgroud) 现在一个类的函数指针到另一个类的函数怎么样?那是我的问题
例:
class Apple
{
int(Apple::*pActionFunc)(void);
};
class Tree
{
Apple* tempy;
void Init( void );
int I_Work( void );
};
void Tree::Init( void )
{
tempy = new Apple( );
tempy->pActionFunc = &Tree::I_Work;
}
int Tree::I_Work( void )
{
"Do Things"
}
Run Code Online (Sandbox Code Playgroud)
那样不行.这是为什么?