实现三种三角形的编码
parent
5fd42b6636
commit
781ec614bc
|
@ -143,10 +143,10 @@ Drawable* Model::processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 mod
|
||||||
GLuint bvhChildren[] = {7/*Êý×鳤¶È*/,0/*ÓëÏÔ´æ¶ÔÆë*/,
|
GLuint bvhChildren[] = {7/*Êý×鳤¶È*/,0/*ÓëÏÔ´æ¶ÔÆë*/,
|
||||||
1,2,
|
1,2,
|
||||||
3,4, 5,6,
|
3,4, 5,6,
|
||||||
7,0, 7,45./360* 4294967296 , 7,0, 7,0};
|
7,0, 7,30./360* 4294967296 , 8,0, 7,0};
|
||||||
QVector4D bvhBound[] = { QVector4D(-1,-1,1,1) ,
|
QVector4D bvhBound[] = { QVector4D(-1,-1,1,1) ,
|
||||||
QVector4D(0.1,0.1,0.4,0.9), QVector4D(0.6,0.1,0.9,0.9),
|
QVector4D(-0.9,-0.9,-0.1,0.9), QVector4D(0.1, -0.9,0.9,0.9),
|
||||||
QVector4D(0.2,0.2,0.3,0.4), QVector4D(0.2,0.5,0.3,0.8), QVector4D(0.7,0.2,0.8,0.4), QVector4D(0.7,0.3,0.8,0.8) };
|
QVector4D(-0.8,-0.8,-0.2,-0.1), QVector4D(-0.7,0.2,-0.2,0.7), QVector4D(0.2,-0.8,0.8,-0.1), QVector4D(0.2,0.1,0.8,0.8) };
|
||||||
glFunc->glGenBuffers(1, &m_mesh->bvhSSBO);
|
glFunc->glGenBuffers(1, &m_mesh->bvhSSBO);
|
||||||
glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_mesh->bvhSSBO);
|
glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_mesh->bvhSSBO);
|
||||||
glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER,sizeof(bvhChildren), bvhChildren, GL_DYNAMIC_DRAW);
|
glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER,sizeof(bvhChildren), bvhChildren, GL_DYNAMIC_DRAW);
|
||||||
|
@ -157,8 +157,21 @@ Drawable* Model::processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 mod
|
||||||
glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(bvhBound), bvhBound, GL_DYNAMIC_DRAW);
|
glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(bvhBound), bvhBound, GL_DYNAMIC_DRAW);
|
||||||
glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
||||||
|
|
||||||
|
GLuint elementIndex[] = { 1/*Êý×鳤¶È*/,
|
||||||
|
0,0,14,14,14,14,
|
||||||
|
14,14,21,21,21,21
|
||||||
|
};
|
||||||
|
glFunc->glGenBuffers(1, &m_mesh->elementIndexSSBO);
|
||||||
|
glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_mesh->elementIndexSSBO);
|
||||||
|
glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(elementIndex), elementIndex, GL_DYNAMIC_DRAW);
|
||||||
|
glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
||||||
|
|
||||||
GLfloat elementData[] = { 1,2,3,4,5 };
|
|
||||||
|
GLfloat elementData[] = {
|
||||||
|
1,0, 0,1, -1,0, 1,
|
||||||
|
-1,0, 0,-1, 1,0, 0,
|
||||||
|
1,0, 0,1, -1,0, 2,
|
||||||
|
};
|
||||||
glFunc->glGenBuffers(1, &m_mesh->elementSSBO);
|
glFunc->glGenBuffers(1, &m_mesh->elementSSBO);
|
||||||
glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_mesh->elementSSBO);
|
glFunc->glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_mesh->elementSSBO);
|
||||||
glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(elementData), elementData, GL_DYNAMIC_DRAW);
|
glFunc->glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(elementData), elementData, GL_DYNAMIC_DRAW);
|
||||||
|
|
|
@ -17,6 +17,7 @@ void PaintingMesh::draw()
|
||||||
|
|
||||||
glFunc->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, bvhSSBO);
|
glFunc->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, bvhSSBO);
|
||||||
glFunc->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, bvhBoundSSBO);
|
glFunc->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, bvhBoundSSBO);
|
||||||
|
glFunc->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, elementIndexSSBO);
|
||||||
glFunc->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, elementSSBO);
|
glFunc->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, elementSSBO);
|
||||||
|
|
||||||
glFunc->glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
|
glFunc->glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
|
||||||
|
|
|
@ -42,7 +42,7 @@ public:
|
||||||
QOpenGLFunctions_4_5_Compatibility* glFunc; //opengl函数入口
|
QOpenGLFunctions_4_5_Compatibility* glFunc; //opengl函数入口
|
||||||
QOpenGLShaderProgram* shaderProgram; //着色器程序
|
QOpenGLShaderProgram* shaderProgram; //着色器程序
|
||||||
|
|
||||||
GLuint bvhSSBO, bvhBoundSSBO, elementSSBO;
|
GLuint bvhSSBO, bvhBoundSSBO, elementIndexSSBO, elementSSBO;
|
||||||
|
|
||||||
/* 函数 */
|
/* 函数 */
|
||||||
PaintingMesh(QOpenGLFunctions_4_5_Compatibility* glFunc, QOpenGLShaderProgram* shaderProgram, aiMatrix4x4 model);
|
PaintingMesh(QOpenGLFunctions_4_5_Compatibility* glFunc, QOpenGLShaderProgram* shaderProgram, aiMatrix4x4 model);
|
||||||
|
|
|
@ -155,15 +155,18 @@ void RendererWidget::paintGL()
|
||||||
|
|
||||||
void RendererWidget::resizeGL(int width, int height)
|
void RendererWidget::resizeGL(int width, int height)
|
||||||
{
|
{
|
||||||
//qDebug() << devicePixelRatio() << width << height;
|
frameWidth = devicePixelRatioF() * width;
|
||||||
|
frameHeight = devicePixelRatioF() * height;
|
||||||
|
qDebug() << frameWidth << "x" << frameHeight;
|
||||||
|
//qDebug() << devicePixelRatioF() << width << height;
|
||||||
//glViewport(0, 0, (GLint)devicePixelRatio()*width, (GLint)devicePixelRatio()*height);
|
//glViewport(0, 0, (GLint)devicePixelRatio()*width, (GLint)devicePixelRatio()*height);
|
||||||
if (fboPtr != nullptr)
|
if (fboPtr != nullptr)
|
||||||
delete fboPtr;
|
delete fboPtr;
|
||||||
fboPtr = new QOpenGLFramebufferObject(devicePixelRatio() * width, devicePixelRatio() * height, QOpenGLFramebufferObject::Depth, GL_TEXTURE_2D);
|
fboPtr = new QOpenGLFramebufferObject(frameWidth, frameHeight, QOpenGLFramebufferObject::Depth, GL_TEXTURE_2D);
|
||||||
fboPtr->bind();
|
fboPtr->bind();
|
||||||
fboPtr->addColorAttachment(devicePixelRatio() * width, devicePixelRatio() * height, GL_RGB16F);
|
fboPtr->addColorAttachment(frameWidth, frameHeight, GL_RGB16F);
|
||||||
fboPtr->addColorAttachment(devicePixelRatio() * width, devicePixelRatio() * height, GL_RGB16F);
|
fboPtr->addColorAttachment(frameWidth, frameHeight, GL_RGB16F);
|
||||||
fboPtr->addColorAttachment(devicePixelRatio() * width, devicePixelRatio() * height, GL_RG);
|
fboPtr->addColorAttachment(frameWidth, frameHeight, GL_RG);
|
||||||
GLenum attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
|
GLenum attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
|
||||||
glDrawBuffers(4, attachments);
|
glDrawBuffers(4, attachments);
|
||||||
|
|
||||||
|
@ -183,6 +186,7 @@ void RendererWidget::timerEvent(QTimerEvent* event)
|
||||||
frameCnt++;
|
frameCnt++;
|
||||||
if (accTime > 1.)
|
if (accTime > 1.)
|
||||||
{
|
{
|
||||||
|
std::cout << " \r";
|
||||||
std::cout << "FPS: " << frameCnt / accTime << "\r";
|
std::cout << "FPS: " << frameCnt / accTime << "\r";
|
||||||
accTime = 0;
|
accTime = 0;
|
||||||
frameCnt = 0;
|
frameCnt = 0;
|
||||||
|
|
|
@ -29,6 +29,7 @@ protected:
|
||||||
void focusOutEvent(QFocusEvent* event) override;
|
void focusOutEvent(QFocusEvent* event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
int frameWidth, frameHeight;
|
||||||
QSet<int> pressedKeys;
|
QSet<int> pressedKeys;
|
||||||
Camera camera;
|
Camera camera;
|
||||||
clock_t lastFrame;
|
clock_t lastFrame;
|
||||||
|
|
|
@ -18,10 +18,10 @@ layout(std430, binding = 2) buffer bvhBoundBuffer
|
||||||
{
|
{
|
||||||
vec4 bvhBound[];
|
vec4 bvhBound[];
|
||||||
};
|
};
|
||||||
layout(std430, binding = 3) buffer elementIndexBuffer
|
layout(std430, binding = 3) buffer elementOffsetBuffer
|
||||||
{
|
{
|
||||||
int elementCount;
|
int elementCount;
|
||||||
int elementIndex[];
|
uint elementOffset[][6];
|
||||||
};
|
};
|
||||||
layout(std430, binding = 4) buffer elementBuffer
|
layout(std430, binding = 4) buffer elementBuffer
|
||||||
{
|
{
|
||||||
|
@ -32,7 +32,7 @@ const float PI = 3.14159265359;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
float border;
|
float border=0;
|
||||||
|
|
||||||
mat2 inv(mat2 m){
|
mat2 inv(mat2 m){
|
||||||
return mat2(m[1][1],-m[0][1],-m[1][0],m[0][0])/(m[0][0]*m[1][1]-m[1][0]*m[0][1]);
|
return mat2(m[1][1],-m[0][1],-m[1][0],m[0][0])/(m[0][0]*m[1][1]-m[1][0]*m[0][1]);
|
||||||
|
@ -454,6 +454,7 @@ void main()
|
||||||
|
|
||||||
vec2 uv = vec2(1.,1.)-TexCoords*2;
|
vec2 uv = vec2(1.,1.)-TexCoords*2;
|
||||||
vec3 debugBVH=vec3(0);
|
vec3 debugBVH=vec3(0);
|
||||||
|
bool debugHit=false;
|
||||||
stack.top=0;
|
stack.top=0;
|
||||||
uint index=0;
|
uint index=0;
|
||||||
while(index<bvhLength||!stack.empty())
|
while(index<bvhLength||!stack.empty())
|
||||||
|
@ -470,7 +471,32 @@ void main()
|
||||||
localUV=rotation*localUV;
|
localUV=rotation*localUV;
|
||||||
localUV/=(bound.zw-bound.xy)/2;
|
localUV/=(bound.zw-bound.xy)/2;
|
||||||
if(all(lessThan(vec2(-1), localUV))&&all(lessThan( localUV, vec2(1))))
|
if(all(lessThan(vec2(-1), localUV))&&all(lessThan( localUV, vec2(1))))
|
||||||
|
{
|
||||||
|
uint elementIndex = leftChild-bvhLength;
|
||||||
debugBVH.bg+=0.5*(localUV+vec2(1));
|
debugBVH.bg+=0.5*(localUV+vec2(1));
|
||||||
|
for(uint i=elementOffset[elementIndex][1];i<elementOffset[elementIndex][2];i+=7)
|
||||||
|
{
|
||||||
|
if(tri_test(localUV, vec2(elementData[i],elementData[i+1]), vec2(elementData[i+2],elementData[i+3]), vec2(elementData[i+4],elementData[i+5]), true))
|
||||||
|
{
|
||||||
|
if(elementData[i+6]==0)
|
||||||
|
{
|
||||||
|
debugHit=true;
|
||||||
|
}
|
||||||
|
else if(elementData[i+6]==1)
|
||||||
|
{
|
||||||
|
if(-bezier_sd(localUV, vec2(elementData[i],elementData[i+1]), vec2(elementData[i+2],elementData[i+3]), vec2(elementData[i+4],elementData[i+5]))>0)
|
||||||
|
debugHit=true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(bezier_sd(localUV, vec2(elementData[i],elementData[i+1]), vec2(elementData[i+2],elementData[i+3]), vec2(elementData[i+4],elementData[i+5]))>0)
|
||||||
|
debugHit=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
index=bvhLength;
|
index=bvhLength;
|
||||||
}
|
}
|
||||||
else if(all(lessThan(bound.xy, uv))&&all(lessThan( uv, bound.zw)))
|
else if(all(lessThan(bound.xy, uv))&&all(lessThan( uv, bound.zw)))
|
||||||
|
@ -488,8 +514,11 @@ void main()
|
||||||
index = bvhChildren[index].y;
|
index = bvhChildren[index].y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(debugHit)
|
||||||
|
gBaseColor = vec4( vec3(1,1,0),1 );
|
||||||
|
else
|
||||||
gBaseColor = vec4( debugBVH,1 );
|
gBaseColor = vec4( debugBVH,1 );
|
||||||
|
//gBaseColor = vec4( vec3(elementData[6]<0.5),1 );
|
||||||
//mainImage(gBaseColor, vec2(1.,1.)-TexCoords);
|
//mainImage(gBaseColor, vec2(1.,1.)-TexCoords);
|
||||||
gPosition = WorldPos;
|
gPosition = WorldPos;
|
||||||
gNormal = normalize(Normal);
|
gNormal = normalize(Normal);
|
||||||
|
|
Loading…
Reference in New Issue