मैं OpenGL 3.3 और GLSL संस्करण 330 के साथ काम करने के लिए एक स्काईबॉक्स प्राप्त करने की कोशिश कर रहा हूं।
मुझे वेब पर कहीं भी पूरी तरह से आधुनिक ओजीएल स्काईबॉक्स ट्यूटोरियल नहीं मिला, इसलिए मैंने एक पुराने एक ( glVertexAttribPointer()
इसके बजाय का उपयोग करके) को आधुनिक बनायाgl_Vertex
) को । यह ज्यादातर काम कर रहा है, लेकिन 2 प्रमुख विवरणों के लिए:
स्काईबॉक्स आकाश त्रिकोण की तरह अधिक हैं, और बनावट बुरी तरह से विकृत और फैली हुई हैं (वे स्टार फ़ील्ड होने चाहिए, मुझे एक काली पृष्ठभूमि पर लाइनें मिलती हैं)। मुझे यकीन है कि यह 99% है क्योंकि मैंने पुराने ट्यूटोरियल को पूरी तरह से सही तरीके से पोर्ट नहीं किया है।
यहाँ मेरा स्काईबॉक्स क्लास है:
static ShaderProgram* cubeMapShader = nullptr;
static const GLfloat vertices[] =
{
1.0f, -1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, -1.0f,
-1.0f, -1.0f, 1.0f,
-1.0f, -1.0f, -1.0f,
-1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, -1.0f,
1.0f, 1.0f, -1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, -1.0f, 1.0f,
1.0f, -1.0f, 1.0f,
1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, -1.0f,
1.0f, -1.0f, 1.0f,
-1.0f, -1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, -1.0f, -1.0f,
1.0f, -1.0f, -1.0f,
1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, -1.0f
};
Skybox::Skybox(const char* xp, const char* xn, const char* yp, const char* yn, const char* zp, const char* zn)
{
if (cubeMapShader == nullptr)
cubeMapShader = new ShaderProgram("cubemap.vert", "cubemap.frag");
texture = SOIL_load_OGL_cubemap(xp, xn, yp, yn, zp, zn, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glBindVertexArray(0);
scale = 1.0f;
}
Skybox::~Skybox()
{
}
void Skybox::Render()
{
ShaderProgram::SetActive(cubeMapShader);
glDisable(GL_DEPTH_TEST);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
cubeMapShader->Uniform1i("SkyTexture", 0);
cubeMapShader->UniformVec3("CameraPosition", Camera::ActiveCameraPosition());
cubeMapShader->UniformMat4("MVP", 1, GL_FALSE, Camera::GetActiveCamera()->GetProjectionMatrix() * Camera::GetActiveCamera()->GetViewMatrix() * glm::mat4(1.0));
glBindVertexArray(vaoID);
glDrawArrays(GL_QUADS, 0, 24);
glBindVertexArray(0);
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
}
वर्टेक्स शेडर:
#version 330
layout(location = 0) in vec3 Vertex;
uniform vec3 CameraPosition;
uniform mat4 MVP;
out vec3 Position;
void main()
{
Position = Vertex.xyz;
gl_Position = MVP * vec4(Vertex.xyz + CameraPosition, 1.0);
}
टुकड़े टुकड़े करना:
#version 330 compatibility
uniform samplerCube SkyTexture;
in vec3 Position;
void main()
{
gl_FragColor = textureCube(SkyTexture, Position);
}
यहाँ glitches का एक उदाहरण है। अगर कोई भी देख सकता है जो जीएलएसएल को अच्छी तरह से जानता है (मैं अभी भी इसे सीख रहा हूं), या स्काईबॉक्स, मैं आपकी किसी भी मदद की सराहना करूंगा। इसके अलावा, अगर आप मुझे सिखा सकते हैं कि खंड-खंड में गैर-पदावनत कार्यों का उपयोग कैसे करें तो मुझे glsl 330 की संगतता प्रोफ़ाइल का उपयोग करने की आवश्यकता नहीं है।
EDIT: तुरंत स्ट्रेचिंग टैक्स्चर के साथ समस्या का पता चला: मैं वर्टेकर शेडर के Position = Vertex.xy
x
बजाय उपयोग कर रहा था Position = Vertex.xy
z
। उफ़। लेकिन त्रिकोण त्रुटि अभी भी मौजूद है।